package packs

import (
	"context"
	"database/sql"
	_ "embed"
	"encoding/json"
	"fmt"
	"log"

	"github.com/nexuscrm/backend/internal/features/metadata"
	"github.com/nexuscrm/shared/pkg/models"
)

//go:embed opportunity_page_layout.json
var opportunityPageLayoutJSON []byte

const (
	CuratedOpportunityLayoutID     = "curated_Opportunity_default"
	curatedOpportunityAssignmentID = "curated_Opportunity_assignment_wildcard"
)

func parseOpportunityPageLayout() (models.PageLayout, error) {
	var layout models.PageLayout
	if err := json.Unmarshal(opportunityPageLayoutJSON, &layout); err != nil {
		return layout, fmt.Errorf("parse opportunity_page_layout.json: %w", err)
	}
	layout.ID = CuratedOpportunityLayoutID
	layout.ObjectAPIName = "Opportunity"
	layout.Source = curatedLayoutSource
	layout.GenerationVersion = 0
	layout.IsCustomized = false
	layout.LayoutVersion = 0
	return layout, nil
}

func seedCuratedOpportunityRelatedLists(db *sql.DB, layout *models.PageLayout) error {
	if layout == nil || len(layout.RelatedLists) > 0 {
		return nil
	}

	nameFieldMap, err := loadNameFieldMap(db)
	if err != nil {
		return fmt.Errorf("load name field map: %w", err)
	}
	candidates, err := getRelatedListCandidates(db, "Opportunity")
	if err != nil {
		return fmt.Errorf("get related list candidates: %w", err)
	}

	resolvedCandidates := resolveMetadataRelatedListCandidates("Opportunity", nameFieldMap, candidates)
	layout.RelatedLists = make([]models.RelatedListConfig, 0, len(resolvedCandidates))
	for _, candidate := range resolvedCandidates {
		if !candidate.IsRecommended {
			continue
		}
		layout.RelatedLists = append(layout.RelatedLists, models.RelatedListConfig{
			ID:             candidate.ID,
			Label:          candidate.Label,
			SecondaryLabel: candidate.SecondaryLabel,
			ObjectAPIName:  candidate.ObjectAPIName,
			LookupField:    candidate.LookupField,
			Fields:         append([]string(nil), candidate.Fields...),
		})
	}

	metadata.SortByCuratedOrder("Opportunity", layout.RelatedLists)
	return nil
}

func applyOpportunityPageLayout(ctx context.Context, db *sql.DB) error {
	log.Println("🔧 Installing curated Opportunity page layout (issues #1529/#1531)...")

	layout, err := parseOpportunityPageLayout()
	if err != nil {
		return err
	}
	if err := seedCuratedOpportunityRelatedLists(db, &layout); err != nil {
		return err
	}

	if err := applyCuratedPageLayout(ctx, db, layout, curatedOpportunityAssignmentID, "Opportunity"); err != nil {
		return err
	}

	log.Printf("   ✅ Curated Opportunity layout installed (%d sections, %d related lists)", len(layout.Sections), len(layout.RelatedLists))
	return nil
}

func verifyCuratedOpportunityLayout(db *sql.DB) error {
	return verifyCuratedPageLayout(db, "Opportunity", CuratedOpportunityLayoutID, "Opportunity")
}
