package dashboard

import (
	"context"
	"os"
	"path/filepath"
	"strings"
	"testing"

	"github.com/nexuscrm/shared/pkg/models"
)

func TestDashboardServiceCoreDoesNotOwnSalesforceRunningUserModes(t *testing.T) {
	for _, filename := range []string{"service.go", "effective_user_policy.go", "validation.go"} {
		data, err := os.ReadFile(filepath.Join(".", filename))
		if err != nil {
			t.Fatalf("read %s: %v", filename, err)
		}
		source := string(data)
		for _, banned := range []string{"SpecifiedUser", "MyTeamUser"} {
			if strings.Contains(source, banned) {
				t.Fatalf("%s contains Salesforce dashboard running-user mode %q; product modes must stay in the external CRM policy, not the generic dashboard service core", filename, banned)
			}
		}
	}
}

type dashboardPolicyFunc func(context.Context, DashboardEffectiveUserRequest) (*models.UserSession, error)

func (f dashboardPolicyFunc) EffectiveUser(ctx context.Context, req DashboardEffectiveUserRequest) (*models.UserSession, error) {
	return f(ctx, req)
}

func TestDashboardServiceResolveEffectiveUserUsesConfiguredPolicy(t *testing.T) {
	viewer := &models.UserSession{ID: "viewer"}
	policyUser := &models.UserSession{ID: "policy-user"}
	def := &Definition{
		ID:            "dash-1",
		DashboardType: "AnyProductMode",
		RunningUserId: "ignored-by-service",
	}

	var seenReq DashboardEffectiveUserRequest
	svc := NewService(nil, nil, WithDashboardEffectiveUserPolicy(dashboardPolicyFunc(
		func(ctx context.Context, req DashboardEffectiveUserRequest) (*models.UserSession, error) {
			seenReq = req
			return policyUser, nil
		},
	)))

	got, err := svc.resolveDashboardEffectiveUser(context.Background(), "dash-1", def, viewer)
	if err != nil {
		t.Fatalf("resolveDashboardEffectiveUser returned error: %v", err)
	}
	if got != policyUser {
		t.Fatalf("effective user = %#v, want configured policy user", got)
	}
	if seenReq.DashboardID != "dash-1" || seenReq.Definition != def || seenReq.Viewer != viewer {
		t.Fatalf("policy request = %#v, want dashboard id, definition, and viewer", seenReq)
	}
}

func TestDashboardServiceResolveEffectiveUserFallsBackToViewerWithoutPolicy(t *testing.T) {
	viewer := &models.UserSession{ID: "viewer"}
	def := &Definition{ID: "dash-1"}
	svc := NewService(nil, nil)

	got, err := svc.resolveDashboardEffectiveUser(context.Background(), "dash-1", def, viewer)
	if err != nil {
		t.Fatalf("resolveDashboardEffectiveUser returned error: %v", err)
	}
	if got != viewer {
		t.Fatalf("effective user = %#v, want viewer fallback", got)
	}
}

func TestDashboardServiceResolveEffectiveUserFallsBackToViewerWhenPolicyReturnsNil(t *testing.T) {
	viewer := &models.UserSession{ID: "viewer"}
	def := &Definition{ID: "dash-1"}
	svc := NewService(nil, nil, WithDashboardEffectiveUserPolicy(dashboardPolicyFunc(
		func(ctx context.Context, req DashboardEffectiveUserRequest) (*models.UserSession, error) {
			return nil, nil
		},
	)))

	got, err := svc.resolveDashboardEffectiveUser(context.Background(), "dash-1", def, viewer)
	if err != nil {
		t.Fatalf("resolveDashboardEffectiveUser returned error: %v", err)
	}
	if got != viewer {
		t.Fatalf("effective user = %#v, want viewer fallback", got)
	}
}
