package config

import "time"

type ServicesConfig struct {
	Collaboration CollaborationServiceConfig `yaml:"collaboration"`
	Workspace     WorkspaceServiceConfig     `yaml:"workspace"`
	Engineer      EngineerServiceConfig      `yaml:"engineer"`
	Dispatch      DispatchServiceConfig      `yaml:"dispatch"`
	Agent         AgentServiceConfig         `yaml:"agent"`
}

type AgentServiceConfig struct {
	// Empty delegates Agent selection to Gateway; all message entrypoints share this Agent.
	AgentID                      string `yaml:"agentID"`
	InstanceID                   string `yaml:"instanceId" default:"ticket-manager" validate:"required"`
	WorkingDirectory             string `yaml:"workingDirectory" default:"." validate:"required"`
	AllowGroupChat               *bool  `yaml:"allowGroupChat"`
	MaxMessageSize               int    `yaml:"maxMessageSize" default:"8000" validate:"min=1"`
	CommentaryMessageMergeBuffer int    `yaml:"commentaryMessageMergeBuffer" default:"4000" validate:"min=1"`
}

func (c AgentServiceConfig) GroupChatAllowed() bool {
	return c.AllowGroupChat == nil || *c.AllowGroupChat
}

type EngineerServiceConfig struct {
	SyncInterval time.Duration `yaml:"syncInterval" default:"12h" validate:"gt=0"`
}

type DispatchServiceConfig struct {
	BotEmails                     []string                                    `yaml:"botEmails" validate:"unique,dive,email"`
	Triage                        DispatchTriageServiceConfig                 `yaml:"triage"`
	StalledAutoAssignmentRecovery DispatchStalledAutoAssignmentRecoveryConfig `yaml:"stalledAutoAssignmentRecovery"`
}

type DispatchTriageServiceConfig struct {
	AgentModel string `yaml:"agentModel"`
}

type DispatchStalledAutoAssignmentRecoveryConfig struct {
	Enabled         bool          `yaml:"enabled" default:"false"`
	ProjectKeys     []string      `yaml:"projectKeys" validate:"required_if=Enabled true,unique,dive,required"`
	Interval        time.Duration `yaml:"interval" default:"5m" validate:"gt=0"`
	Lookback        time.Duration `yaml:"lookback" default:"24h" validate:"gt=0"`
	MinAge          time.Duration `yaml:"minAge" default:"5m" validate:"gt=0"`
	MaxRetries      int           `yaml:"maxRetries" default:"3" validate:"gt=0"`
	PageSize        int           `yaml:"pageSize" default:"50" validate:"gt=0,lte=100"`
	MaxIssuesPerRun int           `yaml:"maxIssuesPerRun" default:"200" validate:"gt=0,lte=500"`
}

type CollaborationServiceConnectorConfig struct {
	LoginURL string `yaml:"loginURL" validate:"required"`
}

type CollaborationServiceConfig struct {
	Connector                  CollaborationServiceConnectorConfig `yaml:"connector"`
	WatchResourceGrantInterval time.Duration                       `yaml:"watchResourceGrantInterval" default:"5m"`
}

type WorkspaceServiceAddTaskAdvisorConfig struct {
	// Empty uses the selected Agent's default model behavior.
	AgentModel       string `yaml:"agentModel"`
	Enabled          bool   `yaml:"enabled" default:"true"`
	TriggerThreshold int    `yaml:"triggerThreshold" default:"4" validate:"gt=2"`
}

type WorkspaceServiceBindLarkMeetingAdvisorConfig struct {
	Enabled bool `yaml:"enabled" default:"true"`
}

type WorkspaceServiceBindLarkDocAdvisorConfig struct {
	Enabled bool `yaml:"enabled" default:"true"`
}

type WorkspaceServiceAdvisorConfig struct {
	AddTask         WorkspaceServiceAddTaskAdvisorConfig         `yaml:"addTask"`
	BindLarkMeeting WorkspaceServiceBindLarkMeetingAdvisorConfig `yaml:"bindLarkMeeting"`
	BindLarkDoc     WorkspaceServiceBindLarkDocAdvisorConfig     `yaml:"bindLarkDoc"`
}

type WorkspaceServiceTimelineConfig struct {
	// Empty uses the selected Agent's default model behavior.
	AgentModel                string                             `yaml:"agentModel"`
	AgentTimeout              time.Duration                      `yaml:"agentTimeout" default:"2m" validate:"gt=0"`
	Enabled                   bool                               `yaml:"enabled" default:"true"`
	WatchInterval             time.Duration                      `yaml:"watchInterval" default:"2m"`
	SyncWarRoomInterval       time.Duration                      `yaml:"syncWarRoomInterval" default:"5m"`
	SyncCaseWorkspaceInterval time.Duration                      `yaml:"syncCaseWorkspaceInterval" default:"20m"`
	AIDraftsEnabled           bool                               `yaml:"aiDraftsEnabled" default:"false"`
	AIEvidenceLimit           int                                `yaml:"aiEvidenceLimit" default:"40"`
	Lark                      WorkspaceServiceTimelineLarkConfig `yaml:"lark"`
}

type WorkspaceServiceTimelineLarkConfig struct {
	Enabled               bool          `yaml:"enabled" default:"false"`
	EventIngestionEnabled bool          `yaml:"eventIngestionEnabled" default:"false"`
	ReconciliationEnabled bool          `yaml:"reconciliationEnabled" default:"false"`
	IngestionLookback     time.Duration `yaml:"ingestionLookback" default:"72h" validate:"gt=0"`
}

type WorkspaceServiceConfig struct {
	Advisor                               WorkspaceServiceAdvisorConfig  `yaml:"taskAdvisor"`
	Timeline                              WorkspaceServiceTimelineConfig `yaml:"timeline"`
	SyncCaseWorkspaceInterval             time.Duration                  `yaml:"syncCaseWorkspaceInterval" default:"1m"`
	SyncOverviewMessageInterval           time.Duration                  `yaml:"syncOverviewMessageInterval" default:"5m"`
	ArchiveCaseWorkspaceInterval          time.Duration                  `yaml:"archiveCaseWorkspaceInterval" default:"1h" validate:"gt=0"`
	ArchiveCaseWorkspaceRecoveryThreshold time.Duration                  `yaml:"archiveCaseWorkspaceRecoveryThreshold" default:"168h" validate:"gt=0"`
}
