package domain

import (
	"context"
	"time"

	"github.com/google/uuid"
)

type Job struct {
	ID          uuid.UUID `json:"id"`
	CompanyID   uuid.UUID `json:"company_id"`
	Title       string    `json:"title"`
	Description string    `json:"description"`
	Location    string    `json:"location"`
	Type        string    `json:"type"` // fulltime, contract, etc.
	SalaryMin   int       `json:"salary_min"`
	SalaryMax   int       `json:"salary_max"`
	IsActive    bool      `json:"is_active"`
	CreatedAt   time.Time `json:"created_at"`
}

type Application struct {
	ID          uuid.UUID `json:"id"`
	CandidateID uuid.UUID `json:"candidate_id"`
	JobID       uuid.UUID `json:"job_id"`
	CompanyID   uuid.UUID `json:"company_id"`
	Status      string    `json:"status"` // applied, screening, interview, test, offered, rejected, hired
	Source      string    `json:"source"` // career_page, referral, etc.
	AppliedAt   time.Time `json:"applied_at"`
	UpdatedAt   time.Time `json:"updated_at"`

	// Join fields
	Job       *Job       `json:"job,omitempty"`
	Candidate *Candidate `json:"candidate,omitempty"`
}

type ApplicationHistory struct {
	ID            uuid.UUID `json:"id"`
	ApplicationID uuid.UUID `json:"application_id"`
	Status        string    `json:"status"`
	Notes         string    `json:"notes"`
	CreatedBy     uuid.UUID `json:"created_by"`
	CreatedAt     time.Time `json:"created_at"`
}

type RecruitmentRepository interface {
	// Job Management
	CreateJob(ctx context.Context, job *Job) error
	GetJobByID(ctx context.Context, id uuid.UUID) (*Job, error)
	ListJobs(ctx context.Context, companyID uuid.UUID, activeOnly bool) ([]Job, error)
	UpdateJob(ctx context.Context, job *Job) error
	DeleteJob(ctx context.Context, id uuid.UUID) error

	// Application Flow
	CreateApplication(ctx context.Context, app *Application) error
	GetApplicationByID(ctx context.Context, id uuid.UUID) (*Application, error)
	ListApplications(ctx context.Context, companyID uuid.UUID, jobID *uuid.UUID, status string) ([]Application, error)
	UpdateApplicationStatus(ctx context.Context, id uuid.UUID, status string) error
	
	// History
	CreateHistory(ctx context.Context, history *ApplicationHistory) error
	GetHistoryByApplication(ctx context.Context, appID uuid.UUID) ([]ApplicationHistory, error)
}

type RecruitmentUsecase interface {
	// Public
	GetActiveJobs(ctx context.Context, companyID uuid.UUID) ([]Job, error)
	GetJobDetail(ctx context.Context, jobID uuid.UUID) (*Job, error)
	ApplyJob(ctx context.Context, candidate *Candidate, jobID uuid.UUID, source string) (*Application, error)

	// Admin
	ManageJobs(ctx context.Context, companyID uuid.UUID) ([]Job, error)
	CreateJob(ctx context.Context, job *Job) error
	UpdateJob(ctx context.Context, job *Job) error
	
	ListApplications(ctx context.Context, companyID uuid.UUID, jobID *uuid.UUID, status string) ([]Application, error)
	UpdateApplicationStatus(ctx context.Context, appID uuid.UUID, status string, notes string, actorID uuid.UUID) error
}
