package scanner

import (
	"path/filepath"
	"strings"
)

type Category string

const (
	CategoryCode   Category = "code"
	CategoryConfig Category = "config"
	CategoryDocs   Category = "docs"
	CategoryInfra  Category = "infra"
	CategoryData   Category = "data"
	CategoryScript Category = "script"
	CategoryMarkup Category = "markup"
)

func ClassifyPath(path string) (language string, category Category) {
	path = filepath.ToSlash(strings.TrimSpace(path))
	lower := strings.ToLower(path)
	ext := strings.ToLower(filepath.Ext(lower))
	base := strings.ToLower(filepath.Base(lower))
	if strings.HasPrefix(base, ".env") && (base == ".env" || strings.HasPrefix(base, ".env.")) {
		return "config", CategoryConfig
	}
	if strings.HasPrefix(base, ".") && !strings.Contains(strings.TrimPrefix(base, "."), ".") {
		return "unknown", CategoryCode
	}
	if strings.HasPrefix(lower, ".github/workflows/") {
		return "github-actions", CategoryInfra
	}
	switch ext {
	case ".go":
		return "go", CategoryCode
	case ".ts", ".tsx":
		return "typescript", CategoryCode
	case ".js", ".jsx", ".mjs", ".cjs":
		return "javascript", CategoryCode
	case ".py":
		return "python", CategoryCode
	case ".rs":
		return "rust", CategoryCode
	case ".java":
		return "java", CategoryCode
	case ".kt", ".kts":
		return "kotlin", CategoryCode
	case ".cs":
		return "csharp", CategoryCode
	case ".php":
		return "php", CategoryCode
	case ".rb":
		return "ruby", CategoryCode
	case ".c", ".h":
		return "c", CategoryCode
	case ".cc", ".cpp", ".cxx", ".hpp":
		return "cpp", CategoryCode
	case ".sh", ".bash", ".zsh", ".fish":
		return "shell", CategoryScript
	case ".md", ".mdx", ".rst", ".txt":
		return "markdown", CategoryDocs
	case ".html", ".htm", ".css", ".scss", ".sass", ".svg":
		return strings.TrimPrefix(ext, "."), CategoryMarkup
	case ".json", ".yaml", ".yml", ".toml", ".ini", ".env":
		return strings.TrimPrefix(ext, "."), CategoryConfig
	case ".sql", ".csv", ".tsv":
		return strings.TrimPrefix(ext, "."), CategoryData
	case ".tf", ".tfvars", ".hcl":
		return "terraform", CategoryInfra
	case ".proto", ".graphql", ".gql":
		return strings.TrimPrefix(ext, "."), CategoryCode
	}
	switch base {
	case "dockerfile", "compose.yml", "compose.yaml", "docker-compose.yml", "docker-compose.yaml":
		return "docker", CategoryInfra
	case "makefile", "justfile", "taskfile.yml", "taskfile.yaml":
		return base, CategoryScript
	case "go.mod", "go.sum":
		return "go", CategoryConfig
	case "package.json", "pnpm-lock.yaml", "yarn.lock", "package-lock.json":
		return "javascript", CategoryConfig
	case "readme", "readme.md":
		return "markdown", CategoryDocs
	}
	if ext != "" {
		return strings.TrimPrefix(ext, "."), CategoryCode
	}
	return "unknown", CategoryCode
}
