package dashboard

import (
	"context"
	"fmt"

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

// UserSessionLoader loads a user session for a dashboard running user.
type UserSessionLoader interface {
	LoadUserSession(ctx context.Context, userID string) (*models.UserSession, error)
}

// WarningLogger is the narrow logging surface used by the CRM Dashboard policy.
type WarningLogger interface {
	Warn(msg string)
}

type crmEffectiveUserPolicy struct {
	sessionLoader UserSessionLoader
	logger        WarningLogger
}

// NewEffectiveUserPolicy creates the Salesforce-compatible CRM Dashboard
// running-user policy.
func NewEffectiveUserPolicy(sessionLoader UserSessionLoader, logger WarningLogger) DashboardEffectiveUserPolicy {
	return &crmEffectiveUserPolicy{
		sessionLoader: sessionLoader,
		logger:        logger,
	}
}

func (p *crmEffectiveUserPolicy) EffectiveUser(ctx context.Context, req DashboardEffectiveUserRequest) (*models.UserSession, error) {
	if req.Definition == nil {
		return req.Viewer, nil
	}
	dashType := req.Definition.DashboardType
	if (dashType != "SpecifiedUser" && dashType != "MyTeamUser") || req.Definition.RunningUserId == "" {
		return req.Viewer, nil
	}
	if p.sessionLoader == nil {
		p.warn(fmt.Sprintf("dashboard running user policy has no session loader (dashboardId=%s runningUserId=%s); falling back to logged-in user", req.DashboardID, req.Definition.RunningUserId))
		return req.Viewer, nil
	}
	runningUser, loadErr := p.sessionLoader.LoadUserSession(ctx, req.Definition.RunningUserId)
	if loadErr != nil {
		p.warn(fmt.Sprintf("dashboard running user not found (dashboardId=%s runningUserId=%s): %v; falling back to logged-in user", req.DashboardID, req.Definition.RunningUserId, loadErr))
		return req.Viewer, nil
	}
	return runningUser, nil
}

func (p *crmEffectiveUserPolicy) warn(msg string) {
	if p == nil || p.logger == nil {
		return
	}
	p.logger.Warn(msg)
}
