package domain

import (
	"context"
	"time"

	"github.com/google/uuid"
)

type CategoryCFIT struct {
	ID          uuid.UUID `json:"id"`
	MinScore    int16     `json:"min_score"`
	MaxScore    int16     `json:"max_score"`
	IQ          int16     `json:"iq"`
	Category    string    `json:"category"`
	Description string    `json:"description"`
	CreatedAt   time.Time `json:"created_at"`
	UpdatedAt   time.Time `json:"updated_at"`
}

type CategoryDISC struct {
	ID             uuid.UUID `json:"id"`
	Code           string    `json:"code"`
	Name           string    `json:"name"`
	Color          string    `json:"color"`
	Characteristic string    `json:"characteristic"`
	Strength       string    `json:"strength"`
	Weakness       string    `json:"weakness"`
	CreatedAt      time.Time `json:"created_at"`
	UpdatedAt      time.Time `json:"updated_at"`
}

type CategoryMBTI struct {
	ID          uuid.UUID `json:"id"`
	Code        string    `json:"code"`
	Name        string    `json:"name"`
	Traits      any       `json:"traits"`
	Careers     any       `json:"careers"`
	Description string    `json:"description"`
	CreatedAt   time.Time `json:"created_at"`
	UpdatedAt   time.Time `json:"updated_at"`
}

type CategoryMSDT struct {
	ID          uuid.UUID `json:"id"`
	Code        string    `json:"code"`
	Name        string    `json:"name"`
	Description string    `json:"description"`
	CreatedAt   time.Time `json:"created_at"`
	UpdatedAt   time.Time `json:"updated_at"`
}

type CategoryPAPI struct {
	ID          uuid.UUID `json:"id"`
	Code        string    `json:"code"`
	Name        string    `json:"name"`
	Dimension   string    `json:"dimension"`
	Order       int16     `json:"order"`
	Description string    `json:"description"`
	CreatedAt   time.Time `json:"created_at"`
	UpdatedAt   time.Time `json:"updated_at"`
}

type AssessmentCategoryRepository interface {
	// CFIT
	CreateCFIT(ctx context.Context, c *CategoryCFIT) error
	ListCFIT(ctx context.Context) ([]CategoryCFIT, error)
	UpdateCFIT(ctx context.Context, c *CategoryCFIT) error
	DeleteCFIT(ctx context.Context, id uuid.UUID) error
	
	// DISC
	CreateDISC(ctx context.Context, c *CategoryDISC) error
	ListDISC(ctx context.Context) ([]CategoryDISC, error)
	UpdateDISC(ctx context.Context, c *CategoryDISC) error
	DeleteDISC(ctx context.Context, id uuid.UUID) error
	
	// MBTI
	CreateMBTI(ctx context.Context, c *CategoryMBTI) error
	ListMBTI(ctx context.Context) ([]CategoryMBTI, error)
	UpdateMBTI(ctx context.Context, c *CategoryMBTI) error
	DeleteMBTI(ctx context.Context, id uuid.UUID) error
	
	// MSDT
	CreateMSDT(ctx context.Context, c *CategoryMSDT) error
	ListMSDT(ctx context.Context) ([]CategoryMSDT, error)
	UpdateMSDT(ctx context.Context, c *CategoryMSDT) error
	DeleteMSDT(ctx context.Context, id uuid.UUID) error
	
	// PAPI
	CreatePAPI(ctx context.Context, c *CategoryPAPI) error
	ListPAPI(ctx context.Context) ([]CategoryPAPI, error)
	UpdatePAPI(ctx context.Context, c *CategoryPAPI) error
	DeletePAPI(ctx context.Context, id uuid.UUID) error
}
