<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

use App\Enums\Invoicing\InvoiceStatus;
use App\Enums\Invoicing\InvoiceCancellationStatus;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('tax_payments', function (Blueprint $table) {
            $table->id();

              //* IDENTIDAD Y RELACIONES
                $table->unsignedBigInteger('substitution_invoice_id')->nullable(); // Complemento de Pago Original/Sustituido (util cuando se emite un CFDI para sustituir otro por X motivo relevante).
                $table->foreign('substitution_invoice_id')
                    ->references('id')
                    ->on('tax_payments')
                    ->nullOnDelete(); // Si la original desaparece, se limpia la referencia.

                $table->unsignedBigInteger('client_id'); // Receptor de la factura (cliente).
                $table->foreign('client_id')
                    ->references('id')
                    ->on('clients')
                    ->cascadeOnDelete();

                $table->unsignedBigInteger('tax_format_id')->nullable(); // Formato visual/render (plantilla de PDF) asociado a la factura.
                $table->foreign('tax_format_id')
                    ->references('id')
                    ->on('tax_formats')
                    ->nullOnDelete();

                $table->unsignedBigInteger('tax_branch_id')->nullable(); // Sucursal emisora de la factura.
                $table->foreign('tax_branch_id')
                    ->references('id')
                    ->on('tax_branches')
                    ->nullOnDelete();

              //* ENCABEZADO CFDI
                $table->char('cfdi_use', 4)->nullable();                // Uso del CFDI (SAT)
                $table->char('payment_form', 3)->nullable();            // Forma de pago (SAT).
                $table->char('currency', 3)->nullable();                // Moneda ISO 4217 (SAT).
                $table->datetime('payment_date');                       // Fecha de emisión del CFDI/timbrado (Es un valor local, por lo que puede diferir de la fecha fiscal).
                $table->datetime('certification_date')->nullable();     // Fecha de certificación del CFDI/timbrado.
                $table->json('third_party_account')->nullable();        // Datos Fiscales del Tercero (únicamente será rellenada cuando la factura en cuestión haya sido en nombre de otra persona o empresa)

              //* IDENTIFICADORES DE TIMBRADO
                $table->unsignedBigInteger('serial_consecutive')->nullable();           // Consecutivo de Serie (ID de control interno de formatos)
                $table->string('facturapi_payment_id', 64)->unique()->nullable();       // UUID de facturapi para el Complemento de Pago
                $table->uuid('sat_uuid')->unique()->nullable();                         // UUID fiscal (Timbre SAT, TFD). Sólo se llena una vez timbrado exitosamente.
                $table->char('cancel_motive', 2)->nullable();                           // Motivo de cancelación (SAT).

                $table->text('verification_url')->nullable();                           // URL de verificación del SAT (base del QR).
                $table->longText('cfdi_seal')->nullable();                              // Sello del comprobante (emisor)
                $table->longText('sat_seal')->nullable();                               // Sello del SAT (Timbre)
                $table->string('sat_cert_number')->nullable();                          // No de Certificado de SAT
                $table->longText('tfd_original_string')->nullable();                    // Cadena original del TFD

              //* IMPORTES, IMPUESTOS Y TOTALES
                $table->decimal('exchange_rate', 14, 6)->nullable();    // Tipo de Cambio (valor de conversión entre la moneda extranjera y el peso mexicano).
                $table->decimal('amount_total', 12, 2)->nullable();     // Cantidad de Dinero abonada

              //* ESTATUS Y CICLO DE VIDA (LOCALES)
                $table->enum('status', array_column(InvoiceStatus::cases(), 'value'))
                    ->default(InvoiceStatus::Draft->value); // Estado interno del documento.

                $table->enum('cancellation_status', array_column(InvoiceCancellationStatus::cases(), 'value'))
                    ->default(InvoiceCancellationStatus::None->value); // Flujo de cancelación SAT (acuse).

              //* ARTEFACTOS / RECURSOS (DESCARGAS Y RUTAS)
                $table->text('xml_path')->nullable();   // Ruta/URL de almacenamiento local del XML (si se guarda en tu servidor).

              //* CONTROL DE RESPUESTAS
                $table->json('request_payload')->nullable();        // Último payload enviado al proveedor (para auditoría/soporte).
                $table->json('response_payload')->nullable();       // Última respuesta recibida del proveedor (incluye timbre, errores, links, etc.).
                $table->json('last_error_returned')->nullable();    // Último error (normalizado o crudo) devuelto por el proveedor o validaciones.

            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('tax_payments');
    }
};
