package internal

import (
	"testing"
	"time"
)

func TestTransformToInvoiceData_CamposBasicos(t *testing.T) {
	in := facturaValida()
	data, err := TransformToInvoiceData(in)
	if err != nil {
		t.Fatalf("TransformToInvoiceData devolvió error inesperado: %v", err)
	}

	if data.EmisorNIF != "A1234567B" {
		t.Errorf("EmisorNIF: esperado A1234567B, obtuvo %s", data.EmisorNIF)
	}
	if data.NumSerie != "INV-2026-001" {
		t.Errorf("NumSerie: esperado INV-2026-001, obtuvo %s", data.NumSerie)
	}
	if data.TipoFactura != "F1" {
		t.Errorf("TipoFactura: esperado F1, obtuvo %s", data.TipoFactura)
	}
	if data.ImporteTotal != 121.0 {
		t.Errorf("ImporteTotal: esperado 121.0, obtuvo %f", data.ImporteTotal)
	}
}

func TestTransformToInvoiceData_FechaParsedaCorrecta(t *testing.T) {
	in := facturaValida()
	data, err := TransformToInvoiceData(in)
	if err != nil {
		t.Fatalf("error inesperado: %v", err)
	}

	esperada := time.Date(2026, 5, 28, 0, 0, 0, 0, time.UTC)
	if !data.Fecha.Equal(esperada) {
		t.Errorf("Fecha: esperado %v, obtuvo %v", esperada, data.Fecha)
	}
}

func TestTransformToInvoiceData_CuotaTotalSumada(t *testing.T) {
	in := facturaValida()
	in.Factura.IVA = []IVAInput{
		{Base: 100, Cuota: 21, Tipo: 21},
		{Base: 200, Cuota: 10, Tipo: 5},
	}
	data, err := TransformToInvoiceData(in)
	if err != nil {
		t.Fatalf("error inesperado: %v", err)
	}

	if data.CuotaTotal != 31.0 {
		t.Errorf("CuotaTotal: esperado 31.0, obtuvo %f", data.CuotaTotal)
	}
}

func TestTransformToInvoiceData_DescripcionPorDefecto(t *testing.T) {
	in := facturaValida()
	in.Factura.Descripcion = ""
	data, err := TransformToInvoiceData(in)
	if err != nil {
		t.Fatalf("error inesperado: %v", err)
	}

	if data.Descripcion != "Factura" {
		t.Errorf("descripción por defecto: esperado 'Factura', obtuvo %q", data.Descripcion)
	}
}

func TestTransformToInvoiceData_SinDestinatario(t *testing.T) {
	in := facturaValida()
	in.Factura.Destinatario = nil
	data, err := TransformToInvoiceData(in)
	if err != nil {
		t.Fatalf("error inesperado: %v", err)
	}
	if data.Destinatario != nil {
		t.Error("sin destinatario en entrada, data.Destinatario debería ser nil")
	}
}

func TestTransformToInvoiceData_ConDestinatario(t *testing.T) {
	in := facturaValida()
	in.Factura.Destinatario = &DestinatarioInput{Nombre: "Cliente SA", NIF: "B11111118"}
	data, err := TransformToInvoiceData(in)
	if err != nil {
		t.Fatalf("error inesperado: %v", err)
	}
	if data.Destinatario == nil {
		t.Fatal("destinatario no debería ser nil")
	}
	if data.Destinatario.Nombre != "Cliente SA" {
		t.Errorf("nombre destinatario: esperado 'Cliente SA', obtuvo %q", data.Destinatario.Nombre)
	}
}

func TestTransformToInvoiceData_IVAClaveRegimenDefecto(t *testing.T) {
	in := facturaValida()
	data, err := TransformToInvoiceData(in)
	if err != nil {
		t.Fatalf("error inesperado: %v", err)
	}

	for i, iva := range data.IVA {
		if iva.ClaveRegimen != "01" {
			t.Errorf("IVA[%d].ClaveRegimen: esperado '01', obtuvo %q", i, iva.ClaveRegimen)
		}
		if iva.Calificacion != "S1" {
			t.Errorf("IVA[%d].Calificacion: esperado 'S1', obtuvo %q", i, iva.Calificacion)
		}
	}
}

func TestTransformToInvoiceData_SistemaDefecto(t *testing.T) {
	in := facturaValida()
	data, err := TransformToInvoiceData(in)
	if err != nil {
		t.Fatalf("error inesperado: %v", err)
	}

	if data.Sistema.TipoUsoVerifactu != "S" {
		t.Errorf("TipoUsoVerifactu: esperado 'S', obtuvo %q", data.Sistema.TipoUsoVerifactu)
	}
	if data.Sistema.TipoUsoMultiOT != "N" {
		t.Errorf("TipoUsoMultiOT: esperado 'N', obtuvo %q", data.Sistema.TipoUsoMultiOT)
	}
	if data.Sistema.IDSistema != "1" {
		t.Errorf("IDSistema: esperado '1', obtuvo %q", data.Sistema.IDSistema)
	}
}
