package training

import (
	"time"

	"github.com/google/uuid"
)

// ============================================================================
// API Request/Response Types
// ============================================================================

// CreateModuleRequest is the API request for creating a training module
type CreateModuleRequest struct {
	ModuleCode      string         `json:"module_code" binding:"required"`
	Title           string         `json:"title" binding:"required"`
	Description     string         `json:"description,omitempty"`
	RegulationArea  RegulationArea `json:"regulation_area" binding:"required"`
	NIS2Relevant    bool           `json:"nis2_relevant"`
	ISOControls     []string       `json:"iso_controls,omitempty"`
	FrequencyType   FrequencyType  `json:"frequency_type" binding:"required"`
	ValidityDays    int            `json:"validity_days"`
	RiskWeight      float64        `json:"risk_weight"`
	ContentType     string         `json:"content_type"`
	DurationMinutes int            `json:"duration_minutes"`
	PassThreshold   int            `json:"pass_threshold"`
}

// UpdateModuleRequest is the API request for updating a training module
type UpdateModuleRequest struct {
	Title           *string  `json:"title,omitempty"`
	Description     *string  `json:"description,omitempty"`
	NIS2Relevant    *bool    `json:"nis2_relevant,omitempty"`
	ISOControls     []string `json:"iso_controls,omitempty"`
	ValidityDays    *int     `json:"validity_days,omitempty"`
	RiskWeight      *float64 `json:"risk_weight,omitempty"`
	DurationMinutes *int     `json:"duration_minutes,omitempty"`
	PassThreshold   *int     `json:"pass_threshold,omitempty"`
	IsActive        *bool    `json:"is_active,omitempty"`
}

// SetMatrixEntryRequest is the API request for setting a CTM entry
type SetMatrixEntryRequest struct {
	RoleCode    string    `json:"role_code" binding:"required"`
	ModuleID    uuid.UUID `json:"module_id" binding:"required"`
	IsMandatory bool      `json:"is_mandatory"`
	Priority    int       `json:"priority"`
}

// ComputeAssignmentsRequest is the API request for computing assignments
type ComputeAssignmentsRequest struct {
	UserID    uuid.UUID `json:"user_id" binding:"required"`
	UserName  string    `json:"user_name" binding:"required"`
	UserEmail string    `json:"user_email" binding:"required"`
	Roles     []string  `json:"roles" binding:"required"`
	Trigger   string    `json:"trigger"`
}

// UpdateAssignmentProgressRequest updates progress on an assignment
type UpdateAssignmentProgressRequest struct {
	Progress int `json:"progress" binding:"required"`
}

// SubmitTrainingQuizRequest is the API request for submitting a quiz
type SubmitTrainingQuizRequest struct {
	AssignmentID    uuid.UUID    `json:"assignment_id" binding:"required"`
	Answers         []QuizAnswer `json:"answers" binding:"required"`
	DurationSeconds *int         `json:"duration_seconds,omitempty"`
}

// SubmitTrainingQuizResponse is the API response for quiz submission
type SubmitTrainingQuizResponse struct {
	AttemptID    uuid.UUID `json:"attempt_id"`
	Score        float64   `json:"score"`
	Passed       bool      `json:"passed"`
	CorrectCount int       `json:"correct_count"`
	TotalCount   int       `json:"total_count"`
	Threshold    int       `json:"threshold"`
}

// GenerateContentRequest is the API request for LLM content generation
type GenerateContentRequest struct {
	ModuleID uuid.UUID `json:"module_id" binding:"required"`
	Language string    `json:"language"`
}

// GenerateQuizRequest is the API request for LLM quiz generation
type GenerateQuizRequest struct {
	ModuleID uuid.UUID `json:"module_id" binding:"required"`
	Count    int       `json:"count"`
}

// PublishContentRequest is the API request for publishing content
type PublishContentRequest struct {
	ReviewedBy uuid.UUID `json:"reviewed_by"`
}

// BulkAssignRequest is the API request for bulk assigning a module
type BulkAssignRequest struct {
	ModuleID  uuid.UUID `json:"module_id" binding:"required"`
	RoleCodes []string  `json:"role_codes" binding:"required"`
	Trigger   string    `json:"trigger"`
	Deadline  time.Time `json:"deadline" binding:"required"`
}

// ModuleListResponse is the API response for listing modules
type ModuleListResponse struct {
	Modules []TrainingModule `json:"modules"`
	Total   int              `json:"total"`
}

// AssignmentListResponse is the API response for listing assignments
type AssignmentListResponse struct {
	Assignments []TrainingAssignment `json:"assignments"`
	Total       int                  `json:"total"`
}

// MatrixResponse is the API response for the full training matrix
type MatrixResponse struct {
	Entries map[string][]TrainingMatrixEntry `json:"entries"` // role_code -> entries
	Roles   map[string]string                `json:"roles"`   // role_code -> label
}

// AuditLogResponse is the API response for listing audit log entries
type AuditLogResponse struct {
	Entries []AuditLogEntry `json:"entries"`
	Total   int             `json:"total"`
}

// EscalationResponse is the API response for escalation check
type EscalationResponse struct {
	Results      []EscalationResult `json:"results"`
	TotalChecked int                `json:"total_checked"`
	Escalated    int                `json:"escalated"`
}

// DeadlineListResponse is the API response for listing deadlines
type DeadlineListResponse struct {
	Deadlines []DeadlineInfo `json:"deadlines"`
	Total     int            `json:"total"`
}
