package controllers

import (
	"io"

	"github.com/gofiber/fiber/v2"
	"github.com/sujit-baniya/fiber-boilerplate/pkg/models"
	"github.com/sujit-baniya/fiber-boilerplate/pkg/services"
)

func WhisperAsrConfigPage(c *fiber.Ctx) error {
	cfg, _ := models.GetWhisperAsrConfig()
	return c.Render("whisper_asr_config", fiber.Map{
		"user":    c.Locals("user"),
		"modules": c.Locals("userModules"),
		"cfg":     cfg,
	}, "layouts/main")
}

func GetWhisperAsrConfigHandler(c *fiber.Ctx) error {
	cfg, err := models.GetWhisperAsrConfig()
	if err != nil {
		return c.JSON(fiber.Map{"data": nil})
	}
	return c.JSON(fiber.Map{"data": cfg})
}

func SaveWhisperAsrConfigHandler(c *fiber.Ctx) error {
	type body struct {
		ID       uint   `json:"id"`
		BaseURL  string `json:"base_url"`
		Username string `json:"username"`
		Password string `json:"password"`
		Notas    string `json:"notas"`
	}
	var b body
	if err := c.BodyParser(&b); err != nil {
		return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "body inválido"})
	}
	if b.BaseURL == "" {
		return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "base_url es requerida"})
	}
	if b.Username == "" || b.Password == "" {
		return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "usuario y contraseña son requeridos"})
	}

	cfg := models.WhisperAsrConfig{BaseURL: b.BaseURL, Username: b.Username, Password: b.Password, Notas: b.Notas}
	cfg.ID = b.ID
	if err := models.SaveWhisperAsrConfig(cfg); err != nil {
		return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
	}
	return c.JSON(fiber.Map{"message": "Configuración guardada"})
}

// TestWhisperAsrConfigHandler recibe un audio de prueba y devuelve la
// transcripción — confirma que la URL/credenciales funcionan de verdad.
func TestWhisperAsrConfigHandler(c *fiber.Ctx) error {
	fh, err := c.FormFile("audio")
	if err != nil {
		return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "audio requerido"})
	}
	if fh.Size > 20*1024*1024 {
		return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "máximo 20MB"})
	}
	f, err := fh.Open()
	if err != nil {
		return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "no se pudo leer el archivo"})
	}
	defer f.Close()
	data, err := io.ReadAll(f)
	if err != nil {
		return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "no se pudo leer el archivo"})
	}

	texto, err := services.TranscribirAudioSelfHosted(data, fh.Filename)
	if err != nil {
		return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": err.Error()})
	}
	return c.JSON(fiber.Map{"text": texto})
}
