package services

import (
	"fmt"
	"os"
	"path/filepath"
	"time"

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

// AdjuntarFacturaCompra toma el documento pendiente de Telegram para este chat
// y lo registra como una cuenta por pagar (factura de compra: un proveedor le
// factura a U-SITE), a diferencia de AdjuntarFacturaVenta que crea una Factura
// ligada a un cliente (U-SITE factura al cliente).
//
// El proveedor se busca por nombre y se crea si no existe, para no obligar a
// darlo de alta manualmente antes de poder registrar la primera compra.
func AdjuntarFacturaCompra(chatID int64, proveedorNombre, descripcion string, monto float64) (*models.CuentaPagar, error) {
	if proveedorNombre == "" {
		return nil, fmt.Errorf("nombre del proveedor requerido")
	}
	if monto <= 0 {
		return nil, fmt.Errorf("monto debe ser mayor a cero")
	}
	att, ok := PopTelegramAttachment(chatID)
	if !ok {
		return nil, fmt.Errorf("no hay ningún documento pendiente en este chat; pide al usuario que lo envíe de nuevo")
	}

	entidad, err := models.GetOrCreateEntidadProveedor(proveedorNombre)
	if err != nil {
		_ = os.Remove(att.Path)
		return nil, err
	}

	dir := "uploads/cuentas_pagar"
	if err := os.MkdirAll(dir, 0755); err != nil {
		_ = os.Remove(att.Path)
		return nil, fmt.Errorf("no se pudo crear el directorio: %w", err)
	}
	ext := filepath.Ext(att.OriginalName)
	finalPath := filepath.Join(dir, fmt.Sprintf("%d_%s%s", entidad.ID, time.Now().Format("20060102150405"), ext))
	if err := os.Rename(att.Path, finalPath); err != nil {
		return nil, fmt.Errorf("no se pudo guardar el archivo: %w", err)
	}

	cp := &models.CuentaPagar{
		EntidadID:    entidad.ID,
		Fecha:        time.Now(),
		Descripcion:  descripcion,
		Valor:        monto,
		Estado:       "pendiente",
		Archivo:      finalPath,
		OriginalName: att.OriginalName,
		TipoMime:     att.MimeType,
	}
	if err := models.CreateCuentaPagar(cp); err != nil {
		return nil, fmt.Errorf("no se pudo registrar la cuenta por pagar: %w", err)
	}
	return cp, nil
}
