package git

import (
	"fmt"
	"path/filepath"
	"strings"

	"bit.admedia.com/scm/ad/adpilot-indexing-repo-sync.com/internal/config"
)

// IsGatewayRepoID reports whether repo_id uses provider:owner/repo form (excludes legacy project/slug).
func IsGatewayRepoID(repoID string) bool {
	return strings.Contains(repoID, ":")
}

// BuildGatewayRepoID returns the canonical repo_id for gateway-imported repos.
func BuildGatewayRepoID(provider, fullName string) string {
	return provider + ":" + fullName
}

// ValidateGatewayRepoID checks provider:owner/repo format used by gateway imports.
func ValidateGatewayRepoID(repoID string) error {
	repoID = strings.TrimSpace(repoID)
	if repoID == "" {
		return fmt.Errorf("repo_id is required")
	}
	colon := strings.Index(repoID, ":")
	if colon <= 0 || colon >= len(repoID)-1 {
		return fmt.Errorf("gateway repo_id must be provider:fullName, got %q", repoID)
	}
	fullName := repoID[colon+1:]
	if strings.Contains(fullName, "..") || strings.Contains(fullName, `\`) {
		return fmt.Errorf("invalid gateway repo_id: %q", repoID)
	}
	parts := strings.Split(fullName, "/")
	if len(parts) != 2 {
		return fmt.Errorf("gateway fullName must be owner/repo, got %q", fullName)
	}
	for _, part := range parts {
		if strings.TrimSpace(part) == "" {
			return fmt.Errorf("invalid gateway repo_id: %q", repoID)
		}
	}
	return nil
}

// GatewayWorkspaceDir returns the local clone path for a gateway repo_id.
func GatewayWorkspaceDir(cfg config.Config, repoID string) (string, error) {
	if err := ValidateGatewayRepoID(repoID); err != nil {
		return "", err
	}
	dirName := strings.ReplaceAll(repoID, "/", "__")
	dirName = strings.ReplaceAll(dirName, ":", "__")
	return filepath.Join(cfg.Git.WorkspacePath, dirName), nil
}

// ParseRepoIDForRead validates either legacy project/slug or gateway provider:owner/repo.
func ParseRepoIDForRead(repoID string) error {
	if strings.Contains(repoID, ":") {
		return ValidateGatewayRepoID(repoID)
	}
	return ValidateRepoID(repoID)
}
