package native

import (
	"encoding/json"
	"fmt"
	"time"

	"VerifactuMidAPI/internal/formats"
)

func init() {
	formats.Register(&Transformer{})
}

type Transformer struct{}

func (t *Transformer) Name() string { return "native" }

type Input struct {
	Tipo    string       `json:"tipo"`
	Factura FacturaInput `json:"factura"`
	Sistema SistemaInput `json:"sistema"`
}

type FacturaInput struct {
	EmisorNIF       string                `json:"emisor_nif"`
	EmisorNombre    string                `json:"emisor_nombre"`
	NumSerie        string                `json:"num_serie"`
	FechaExpedicion string                `json:"fecha_expedicion"`
	TipoFactura     string                `json:"tipo_factura"`
	Descripcion     string                `json:"descripcion"`
	Destinatario    *DestinatarioInput    `json:"destinatario,omitempty"`
	IVA             []IVAInput            `json:"iva"`
	ImporteTotal    float64               `json:"importe_total"`
}

type DestinatarioInput struct {
	Nombre string `json:"nombre"`
	NIF    string `json:"nif"`
}

type IVAInput struct {
	Base  float64 `json:"base"`
	Cuota float64 `json:"cuota"`
	Tipo  float64 `json:"tipo"`
}

type SistemaInput struct {
	Nombre       string `json:"nombre"`
	NIFProveedor string `json:"nif_proveedor"`
	Version      string `json:"version"`
}

func (t *Transformer) Transform(raw json.RawMessage) (*formats.TransformResult, error) {
	var in Input
	if err := json.Unmarshal(raw, &in); err != nil {
		return nil, fmt.Errorf("invalid native format: %w", err)
	}

	var dest *formats.DestinatarioData
	if in.Factura.Destinatario != nil {
		dest = &formats.DestinatarioData{
			Nombre: in.Factura.Destinatario.Nombre,
			NIF:    in.Factura.Destinatario.NIF,
		}
	}

	iva := make([]formats.IVAData, len(in.Factura.IVA))
	for i, v := range in.Factura.IVA {
		iva[i] = formats.IVAData{Base: v.Base, Cuota: v.Cuota, Tipo: v.Tipo}
	}

	_, err := time.Parse("02-01-2006", in.Factura.FechaExpedicion)
	if err != nil {
		return nil, fmt.Errorf("invalid fecha_expedicion: %w", err)
	}

	return &formats.TransformResult{
		EmisorNIF:       in.Factura.EmisorNIF,
		EmisorNombre:    in.Factura.EmisorNombre,
		NumSerie:        in.Factura.NumSerie,
		FechaExpedicion: in.Factura.FechaExpedicion,
		TipoFactura:     in.Factura.TipoFactura,
		Descripcion:     in.Factura.Descripcion,
		Destinatario:    dest,
		IVA:             iva,
		ImporteTotal:    in.Factura.ImporteTotal,
		Sistema: formats.SistemaData{
			Nombre:       in.Sistema.Nombre,
			NIFProveedor: in.Sistema.NIFProveedor,
			Version:      in.Sistema.Version,
		},
	}, nil
}
