package handlers

import (
	"net/http"

	"github.com/google/uuid"
	"github.com/labstack/echo/v5"

	"bookhoard/internal/database"
	"bookhoard/internal/services"
)

type JobsHandler struct {
	db     *database.Queries
	worker *services.Worker
}

func NewJobsHandler(db *database.Queries, worker *services.Worker) *JobsHandler {
	return &JobsHandler{
		db:     db,
		worker: worker,
	}
}

// CreateJob creates a new job based on type
func (h *JobsHandler) CreateJob(c *echo.Context) error {
	var req struct {
		Type   string                 `json:"type"`
		Params map[string]interface{} `json:"params"`
	}

	if err := c.Bind(&req); err != nil {
		return c.JSON(http.StatusBadRequest, map[string]string{
			"error": "Invalid request body",
		})
	}

	// Validate job type
	var jobType services.JobType
	switch req.Type {
	case "import", "convert", "thumbnails", "backup", "analytics":
		jobType = services.JobType(req.Type)
	default:
		return c.JSON(http.StatusBadRequest, map[string]string{
			"error": "Invalid job type",
		})
	}

	// Add database to params
	req.Params["db"] = h.db

	// Create job
	job := &services.Job{
		ID:     uuid.New().String(),
		Type:   jobType,
		Params: req.Params,
		Status: services.JobStatusPending,
	}

	// Enqueue job
	if err := h.worker.EnqueueJob(job); err != nil {
		return c.JSON(http.StatusInternalServerError, map[string]string{
			"error": "Failed to enqueue job",
		})
	}

	return c.JSON(http.StatusAccepted, map[string]interface{}{
		"message": "Job created",
		"job_id":  job.ID,
		"type":    req.Type,
		"status":  "pending",
	})
}

// GetJobStatus returns the status of a specific job
func (h *JobsHandler) GetJobStatus(c *echo.Context) error {
	jobID := c.Param("jobId")

	result, exists := h.worker.GetJobStatus(jobID)
	if !exists {
		return c.JSON(http.StatusNotFound, map[string]string{
			"error": "Job not found",
		})
	}

	return c.JSON(http.StatusOK, result)
}
