package org

import (
	"context"
	"log/slog"

	"github.com/tidbcloud/AgentTeam/internal/mailer"
)

type organizationHandlerBase struct {
	organizations       OrganizationProvider
	planStore           PlanStore
	runtime             Runtime
	llmRegistry         LLMRegistryRefresher
	hostedModels        HostedAvailabilityClient
	knowledgeQAPolicies KnowledgeQAPolicyStore
	mailer              mailer.Mailer
	logger              *slog.Logger
}

func (handler organizationHandlerBase) organizationProvider() (OrganizationProvider, bool) {
	if handler.organizations == nil {
		return nil, false
	}
	return handler.organizations, true
}

func (handler organizationHandlerBase) organizationPlanStore() (PlanStore, bool) {
	if handler.planStore == nil {
		return nil, false
	}
	return handler.planStore, true
}

func (handler organizationHandlerBase) refreshLLMRegistry(ctx context.Context) error {
	if handler.llmRegistry == nil {
		return nil
	}
	return handler.llmRegistry.Refresh(ctx)
}

func (handler organizationHandlerBase) codexProviderRuntime() (CodexProviderRuntime, bool) {
	if handler.llmRegistry == nil {
		return nil, false
	}
	runtime, ok := handler.llmRegistry.(CodexProviderRuntime)
	if !ok || runtime == nil {
		return nil, false
	}
	return runtime, true
}

// CollectionHandler owns the top-level organization collection routes.
type CollectionHandler struct {
	organizationHandlerBase
}

// SettingsHandler owns organization settings and directory sync run routes.
type SettingsHandler struct {
	organizationHandlerBase
}

// HostedModelHandler owns organization hosted model settings and workspace authorization routes.
type HostedModelHandler struct {
	organizationHandlerBase
}

// KnowledgeQAPolicyHandler owns organization-wide Knowledge Q&A settings.
type KnowledgeQAPolicyHandler struct {
	organizationHandlerBase
}

// PlanHandler owns organization plan routes.
type PlanHandler struct {
	organizationHandlerBase
}

// FeishuHandler owns organization enterprise Feishu routes.
type FeishuHandler struct {
	organizationHandlerBase
}

// InviteHandler owns organization invite routes.
type InviteHandler struct {
	organizationHandlerBase
}

// UnitHandler owns organization unit membership routes.
type UnitHandler struct {
	organizationHandlerBase
}

// TeamHandler owns organization team membership routes.
type TeamHandler struct {
	organizationHandlerBase
}

// MemberHandler owns organization member routes.
type MemberHandler struct {
	organizationHandlerBase
}

// WorkspaceAccessHandler owns organization workspace ownership and grant routes.
type WorkspaceAccessHandler struct {
	organizationHandlerBase
}

// ProviderHandler owns organization-managed provider catalog and grant routes.
type ProviderHandler struct {
	organizationHandlerBase
}
