package httpserver

import (
	"net/http"
	"strings"

	apicontract "bit.admedia.com/scm/ad/adpilot-indexing-repo-sync.com/internal/contracts/api"
	"bit.admedia.com/scm/ad/adpilot-indexing-repo-sync.com/internal/service"
)

const (
	gatewayIndexedReposHeader = "X-Gateway-Indexed-Repos"
	gatewayInternalSecretHeader = "X-Internal-Secret"
)

// IndexedRepoLister exposes minimal indexed repository summaries for UI listing.
type IndexedRepoLister interface {
	ListIndexedRepos(orgID string) ([]apicontract.IndexedRepoResponse, error)
}

var _ IndexedRepoLister = (*service.SyncService)(nil)

func handleListIndexedRepos(lister IndexedRepoLister, gatewayInternalSecret string) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		secret := strings.TrimSpace(gatewayInternalSecret)
		if secret == "" {
			writeJSON(w, http.StatusServiceUnavailable, errorResponse{Error: "indexed repos API not configured"})
			return
		}
		if strings.TrimSpace(r.Header.Get(gatewayInternalSecretHeader)) != secret {
			writeJSON(w, http.StatusUnauthorized, errorResponse{Error: "unauthorized"})
			return
		}

		orgID := strings.TrimSpace(r.URL.Query().Get("orgId"))
		if orgID == "" {
			orgID = strings.TrimSpace(r.Header.Get("X-Org-Id"))
		}

		fromGateway := strings.TrimSpace(r.Header.Get(gatewayIndexedReposHeader)) != ""
		if fromGateway && orgID == "" {
			writeJSON(w, http.StatusBadRequest, errorResponse{Error: "orgId is required for gateway indexed repo listing"})
			return
		}

		repos, err := lister.ListIndexedRepos(orgID)
		if err != nil {
			writeJSON(w, http.StatusInternalServerError, errorResponse{Error: "failed to list indexed repositories"})
			return
		}

		if repos == nil {
			repos = []apicontract.IndexedRepoResponse{}
		}

		writeJSON(w, http.StatusOK, apicontract.IndexedReposResponse{Repos: repos})
	}
}
