package services

import (
	"fmt"
	"time"

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

// GenerarDocumentoCuentaCobro produce el PDF de solicitud de cuenta de cobro para
// una cuenta ya existente, usando la plantilla activa tipo 'cuenta_cobro' + los
// datos fiscales de U-SITE (DatosBaseDocumento), para que salga correcta sin
// revisión manual.
func GenerarDocumentoCuentaCobro(cuentaCobroID uint, generadoPor string) (*models.DocumentoGenerado, error) {
	cc, err := models.GetCuentaCobroByID(cuentaCobroID)
	if err != nil {
		return nil, fmt.Errorf("cuenta de cobro no encontrada: %w", err)
	}

	datos := DatosBaseDocumento(map[string]interface{}{
		"CuentaCobro": cc,
		"Cliente":     cc.Cliente,
		"Descripcion": cc.Descripcion,
		"Valor":       cc.Valor,
		"FechaCuenta": cc.Fecha.Format("02/01/2006"),
		"Notas":       cc.Notas,
	})

	doc, _, err := GenerarDocumento("cuenta_cobro", datos, &cc.ClienteID, nil, generadoPor)
	return doc, err
}

// CrearCuentaCobroConDocumento crea el registro de cuenta de cobro y de una vez
// genera su PDF, para el flujo "proyecto, monto, periodo" de la automatización con IA.
func CrearCuentaCobroConDocumento(clienteID uint, descripcion string, valor float64, fechaVencimiento *time.Time, notas, generadoPor string) (*models.CuentaCobro, *models.DocumentoGenerado, error) {
	if clienteID == 0 {
		return nil, nil, fmt.Errorf("cliente_id requerido")
	}
	if valor <= 0 {
		return nil, nil, fmt.Errorf("valor debe ser mayor a cero")
	}

	cc := &models.CuentaCobro{
		ClienteID:        clienteID,
		Fecha:            time.Now(),
		Descripcion:      descripcion,
		Valor:            valor,
		Estado:           "pendiente",
		FechaVencimiento: fechaVencimiento,
		Notas:            notas,
	}
	if err := models.CreateCuentaCobro(cc); err != nil {
		return nil, nil, fmt.Errorf("no se pudo crear la cuenta de cobro: %w", err)
	}

	doc, err := GenerarDocumentoCuentaCobro(cc.ID, generadoPor)
	if err != nil {
		return cc, nil, err
	}
	return cc, doc, nil
}
