package services

import (
	"testing"

	"github.com/sujit-baniya/fiber-boilerplate/app"
	"github.com/sujit-baniya/fiber-boilerplate/config"
	"github.com/sujit-baniya/fiber-boilerplate/pkg/models"
)

// ─── Helpers ──────────────────────────────────────────────────────────────────

func setupTestApp() {
	if app.Http == nil {
		app.Http = &config.AppConfig{
			Server: config.ServerConfig{
				Url:  "http://localhost",
				Port: "8080",
			},
		}
	}
}

func TestSendSoporteAutoRespuestaNilTicket(t *testing.T) {
	setupTestApp()
	// No debe panic si ticket es nil
	SendSoporteAutoRespuesta(nil)
}

func TestSendSoporteAutoRespuestaSinEmail(t *testing.T) {
	setupTestApp()
	ticket := &models.ProyectoTicket{
		Titulo:      "Test",
		Descripcion: "Desc",
		AutorNombre: "Cliente",
		Origen:      "email",
	}
	// No debe hacer nada si no tiene email
	SendSoporteAutoRespuesta(ticket)
}

func TestSendSoporteAutoRespuestaConEmail(t *testing.T) {
	setupTestApp()
	ticket := &models.ProyectoTicket{
		EmailFrom:   "cliente@test.com",
		Titulo:      "Ayuda con factura",
		Descripcion: "No puedo ver mi factura de enero",
		AutorNombre: "Juan Pérez",
		Origen:      "email",
	}
	app.Http.Mail.FromAddress = "soporte@u-s.app"
	app.Http.Mail.Host = "127.0.0.1"
	app.Http.Mail.Port = 2525
	// Solo verificar que no panic (enviaría a un SMTP que no existe, pero el go routine captura error)
	SendSoporteAutoRespuesta(ticket)
}

func TestSendSoporteNotifAdminNil(t *testing.T) {
	setupTestApp()
	SendSoporteNotifAdmin(nil)
}

func TestSendSoporteNotifAdminSinSmtp(t *testing.T) {
	setupTestApp()
	ticket := &models.ProyectoTicket{
		EmailFrom:   "cliente@test.com",
		Titulo:      "Problema",
		Descripcion: "No funciona",
		AutorNombre: "Cliente",
	}
	// Sin SMTP config no debe panic
	SendSoporteNotifAdmin(ticket)
}

func TestSendSoporteAutoRespuestaOrigenPortal(t *testing.T) {
	setupTestApp()
	ticket := &models.ProyectoTicket{
		EmailFrom:   "",
		Titulo:      "Portal ticket",
		Descripcion: "Desc",
		AutorNombre: "Portal User",
		Origen:      "portal",
	}
	// No debe intentar enviar email porque EmailFrom está vacío
	SendSoporteAutoRespuesta(ticket)
}

func TestSendSoporteNotifAdminConSmtp(t *testing.T) {
	setupTestApp()
	// Simular SMTP config en app.Http.Mail
	app.Http.Mail.FromAddress = "admin@u-s.app"
	app.Http.Mail.Host = "127.0.0.1"
	app.Http.Mail.Port = 2525

	ticket := &models.ProyectoTicket{
		// gorm.Model embedido: ID se asigna via Create en DB real
		EmailFrom:   "cliente@test.com",
		Titulo:      "Error en el sistema",
		Descripcion: "Recibo un error 500",
		AutorNombre: "María López",
		Origen:      "email",
	}
	// Verificar que no panic (el email se envía en goroutine)
	SendSoporteNotifAdmin(ticket)
}
