package domain

import (
	"context"
	"time"

	"github.com/google/uuid"
)

type AssessmentSession struct {
	ID             uuid.UUID  `json:"id"`
	CandidateID    uuid.UUID  `json:"candidate_id"`
	CompanyID      uuid.UUID  `json:"company_id"`
	TestTypeID     uuid.UUID  `json:"test_type_id"` // Changed to UUID to match new schema
	Status         string     `json:"status"`       // PENDING, ON_PROGRESS, COMPLETED
	StartTime      *time.Time `json:"start_time"`
	EndTime        *time.Time `json:"end_time"`
	CreatedAt      time.Time  `json:"created_at"`
	UpdatedAt      time.Time  `json:"updated_at"`
	RecruiterEmail *string    `json:"recruiter_email"`
}

type CandidateAnswer struct {
	ID           uuid.UUID `json:"id"`
	CandidateID  uuid.UUID `json:"candidate_id"`
	QuestionID   uuid.UUID `json:"question_id"`
	SessionID    uuid.UUID `json:"session_id"`
	Answer       string    `json:"answer"` // JSON array of integers for multiple answers, or single integer as string
	IsCorrect    *bool     `json:"is_correct"`
	Score        float64   `json:"score"`
	ResponseTime int       `json:"response_time"`
	AnsweredAt   time.Time `json:"answered_at"`
}

type AssessmentRepository interface {
	CreateSession(ctx context.Context, session *AssessmentSession) error
	GetSessionByID(ctx context.Context, id uuid.UUID) (*AssessmentSession, error)
	GetSessionsByCandidate(ctx context.Context, candidateID uuid.UUID) ([]AssessmentSession, error)
	UpdateSessionStatus(ctx context.Context, id uuid.UUID, status string) error

	GetQuestionsByTestType(ctx context.Context, testTypeID uuid.UUID) ([]Question, error)
	GetQuestionByID(ctx context.Context, id uuid.UUID) (*Question, error)

	SaveAnswer(ctx context.Context, answer *CandidateAnswer) error
	GetAnswersBySession(ctx context.Context, sessionID uuid.UUID) ([]CandidateAnswer, error)
}

type AssessmentUsecase interface {
	StartSession(ctx context.Context, candidateID uuid.UUID, testTypeID uuid.UUID) (*AssessmentSession, error)
	GetQuestions(ctx context.Context, sessionID uuid.UUID) ([]Question, error)
	SubmitAnswer(ctx context.Context, answer *CandidateAnswer) error
	CompleteSession(ctx context.Context, sessionID uuid.UUID) error
	GetDISCResults(ctx context.Context, sessionID uuid.UUID) (any, error)
	GetMBTIResults(ctx context.Context, sessionID uuid.UUID) (any, error)
}
