package dto

import (
	"encoding/json"
	"time"
)

type JobStatus string

const (
	StatusQueued    JobStatus = "queued"
	StatusRunning   JobStatus = "running"
	StatusSucceeded JobStatus = "succeeded"
	StatusFailed    JobStatus = "failed"
	StatusCanceled  JobStatus = "canceled"
	StatusRetrying  JobStatus = "retrying"
	StatusScheduled JobStatus = "scheduled"
)

// Job represents a background job managed by Archer.
// swagger:model Job
type Job struct {
	ID          string     `json:"id" example:"01HF7SZK8Z8WG1M3J7S2Z8M2N6"`
	Type        string     `json:"type" example:"email.send"`
	Queue       string     `json:"queue" example:"default"`
	Status      JobStatus  `json:"status" example:"queued" enums:"queued|running|succeeded|failed|canceled|retrying|scheduled"`
	Attempts    int        `json:"attempts" example:"0"`
	MaxAttempts int        `json:"max_attempts,omitempty" example:"3"`
	CreatedAt   time.Time  `json:"created_at" example:"2025-11-04T09:30:00Z"`
	UpdatedAt   *time.Time `json:"updated_at,omitempty" example:"2025-11-04T09:30:00Z"`
	LastError   *string    `json:"last_error,omitempty" example:"error message"`
	RunAt       *time.Time `json:"run_at,omitempty" example:"2025-11-04T09:30:00Z"`
	Payload     any        `json:"payload,omitempty"`
}

// QueueInfo holds queue-level counts.
// swagger:model QueueInfo
type QueueInfo struct {
	Name      string `json:"name" example:"default"`
	Pending   int    `json:"pending" example:"42"`
	Running   int    `json:"running" example:"3"`
	Failed    int    `json:"failed" example:"5"`
	Scheduled int    `json:"scheduled" example:"7"`
}

// PageJob is a concrete paginated response for Job (generics not supported by swag).
// swagger:model PageJob
type PageJob struct {
	Items    []Job `json:"items"`
	Total    int   `json:"total" example:"120"`
	Page     int   `json:"page" example:"1"`
	PageSize int   `json:"page_size" example:"25"`
}

// EnqueueRequest is the POST body for creating a job.
// swagger:model EnqueueRequest
type EnqueueRequest struct {
	Queue   string          `json:"queue" example:"default"`
	Type    string          `json:"type" example:"email.send"`
	Payload json.RawMessage `json:"payload" swaggertype:"object"`
	RunAt   *time.Time      `json:"run_at" example:"2025-11-05T08:00:00Z"`
}
