package uiapi

import (
	"context"
	"testing"
	"time"

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

func testLayoutServiceWithRepo(metaRepo *mockMetaRepo) (*Service, func()) {
	ms := metadata.NewMetadataService(metaRepo, nil, nil)
	svc := NewService(nil, ms, nil, nil)
	return svc, func() { svc.Close() }
}

func TestGetLayoutMetadata_ProjectsEffectiveDefaultFromLiveWildcardTarget(t *testing.T) {
	metaRepo := newMockMetaRepo()
	metaRepo.layouts["Opportunity"] = []*models.PageLayout{
		{
			ID:            "layout_valid_default",
			ObjectAPIName: "Opportunity",
			LayoutName:    "Valid Default",
			Type:          "Detail",
			IsDefault:     false,
		},
	}
	metaRepo.assignmentsByObject["opportunity"] = []*models.LayoutAssignment{
		{
			ID:            "assignment_orphan",
			ObjectAPIName: "Opportunity",
			LayoutID:      "missing_layout",
			CreatedDate:   time.Unix(10, 0),
		},
		{
			ID:            "assignment_live",
			ObjectAPIName: "Opportunity",
			LayoutID:      "layout_valid_default",
			CreatedDate:   time.Unix(20, 0),
		},
	}

	svc, cleanup := testLayoutServiceWithRepo(metaRepo)
	defer cleanup()

	layout, err := svc.GetLayoutMetadata(context.Background(), "layout_valid_default")
	if err != nil {
		t.Fatalf("GetLayoutMetadata() error = %v", err)
	}
	if layout == nil {
		t.Fatal("expected layout, got nil")
	}
	if !layout.IsDefault {
		t.Fatal("expected effective default to follow live wildcard target")
	}
}

func TestCreateAssignment_StampsAdminAuthoredRouteSource(t *testing.T) {
	metaRepo := newMockMetaRepo()
	svc, cleanup := testLayoutServiceWithRepo(metaRepo)
	defer cleanup()

	routeSource := models.LayoutAssignmentRouteSourceManagedSeed
	assignment := &models.LayoutAssignment{
		ObjectAPIName: "Opportunity",
		LayoutID:      "layout_valid_default",
		RouteSource:   &routeSource,
	}
	if err := svc.CreateAssignment(context.Background(), assignment); err != nil {
		t.Fatalf("CreateAssignment() error = %v", err)
	}
	if assignment.RouteSource == nil {
		t.Fatal("expected routeSource to be stamped")
	}
	if *assignment.RouteSource != models.LayoutAssignmentRouteSourceAdminAuthored {
		t.Fatalf("routeSource = %q, want %q", *assignment.RouteSource, models.LayoutAssignmentRouteSourceAdminAuthored)
	}
}
