<?php

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

/**
 * Facturación electrónica de Ecuador (SRI - Servicio de Rentas Internas).
 *
 * Crea las tablas para comprobantes electrónicos (Factura, Nota de Crédito,
 * Nota de Débito y Comprobante de Retención), sus detalles, los puntos de
 * emisión (establecimiento + punto de emisión + secuenciales) y agrega los
 * campos del SRI a la tabla de empresas.
 */
return new class extends Migration
{
    public function up(): void
    {
        // ---- Campos SRI en la tabla empresas ----
        Schema::table('empresas', function (Blueprint $table) {
            $table->string('dir_matriz')->nullable()->after('direccion');
            $table->string('dir_establecimiento')->nullable()->after('dir_matriz');
            $table->boolean('obligado_contabilidad')->default(false)->after('dir_establecimiento');
            $table->string('contribuyente_especial', 20)->nullable()->after('obligado_contabilidad');
            $table->string('agente_retencion', 20)->nullable()->after('contribuyente_especial');
            $table->string('provincia', 100)->nullable()->after('ciudad');
            $table->string('canton', 100)->nullable()->after('provincia');
            $table->string('parroquia', 100)->nullable()->after('canton');

            // Configuración del SRI
            $table->string('sri_ambiente', 1)->default('1')->after('agente_retencion');   // 1=Pruebas, 2=Producción
            $table->string('sri_tipo_emision', 1)->default('1')->after('sri_ambiente');    // 1=Emisión normal
            $table->string('sri_certificado_path')->nullable()->after('sri_tipo_emision'); // ruta al .p12
            $table->string('sri_certificado_clave')->nullable()->after('sri_certificado_path');
            $table->boolean('facturacion_electronica_activa')->default(false)->after('sri_certificado_clave');
        });

        // ---- Puntos de emisión (establecimiento + punto + secuenciales) ----
        Schema::create('puntos_emision', function (Blueprint $table) {
            $table->id();
            $table->string('estab', 3);     // 001
            $table->string('pto_emi', 3);   // 001
            $table->string('descripcion')->nullable();
            $table->string('direccion')->nullable();
            $table->unsignedInteger('sec_factura')->default(0);
            $table->unsignedInteger('sec_nota_credito')->default(0);
            $table->unsignedInteger('sec_nota_debito')->default(0);
            $table->unsignedInteger('sec_retencion')->default(0);
            $table->boolean('activo')->default(true);
            $table->timestamps();

            $table->unique(['estab', 'pto_emi']);
        });

        // ---- Comprobantes electrónicos ----
        Schema::create('comprobantes_electronicos', function (Blueprint $table) {
            $table->id();
            $table->foreignId('venta_id')->nullable()->constrained('ventas')->nullOnDelete();

            // Identificación del comprobante
            $table->string('tipo_documento', 2);   // 01=Factura, 04=NC, 05=ND, 07=Retención
            $table->string('ambiente', 1);         // 1=Pruebas, 2=Producción
            $table->string('tipo_emision', 1)->default('1');
            $table->string('estab', 3);
            $table->string('pto_emi', 3);
            $table->string('secuencial', 9);
            $table->string('numero_completo', 17)->index();  // 001-001-000000001
            $table->string('clave_acceso', 49)->nullable()->unique();
            $table->string('codigo_numerico', 8)->nullable();

            // Emisor (snapshot al momento de emitir)
            $table->string('emisor_ruc', 13);
            $table->string('emisor_razon_social');
            $table->string('emisor_nombre_comercial')->nullable();
            $table->string('emisor_dir_matriz')->nullable();
            $table->string('emisor_dir_establecimiento')->nullable();
            $table->string('obligado_contabilidad', 2)->default('NO'); // SI / NO
            $table->string('contribuyente_especial', 20)->nullable();

            // Receptor / sujeto
            $table->string('receptor_tipo_identificacion', 2); // 04=RUC,05=Cédula,06=Pasaporte,07=Consumidor final,08=Exterior
            $table->string('receptor_identificacion', 20);
            $table->string('receptor_razon_social');
            $table->string('receptor_direccion')->nullable();
            $table->string('receptor_email')->nullable();
            $table->string('receptor_telefono', 30)->nullable();

            $table->date('fecha_emision');
            $table->string('moneda', 10)->default('DOLAR');

            // Totales
            $table->decimal('total_sin_impuestos', 12, 2)->default(0);
            $table->decimal('total_descuento', 12, 2)->default(0);
            $table->decimal('total_ice', 12, 2)->default(0);
            $table->decimal('total_iva', 12, 2)->default(0);
            $table->decimal('propina', 12, 2)->default(0);
            $table->decimal('importe_total', 12, 2)->default(0);

            // Notas de crédito / débito (documento modificado)
            $table->string('cod_doc_modificado', 2)->nullable();
            $table->string('num_doc_modificado', 17)->nullable();
            $table->date('fecha_emision_doc_sustento')->nullable();
            $table->string('motivo')->nullable();
            $table->decimal('valor_modificacion', 12, 2)->nullable();

            // Comprobante de retención
            $table->string('periodo_fiscal', 7)->nullable();   // MM/AAAA
            $table->string('doc_sustento_tipo', 2)->nullable();
            $table->string('doc_sustento_numero', 17)->nullable();
            $table->date('doc_sustento_fecha')->nullable();
            $table->decimal('total_retenido', 12, 2)->nullable();

            // Estado en el SRI
            $table->enum('estado_sri', [
                'CREADO', 'FIRMADO', 'ENVIADO', 'RECIBIDA', 'DEVUELTA',
                'AUTORIZADO', 'NO_AUTORIZADO', 'RECHAZADO', 'EXCEPCION',
            ])->default('CREADO');
            $table->string('numero_autorizacion', 49)->nullable();
            $table->dateTime('fecha_autorizacion')->nullable();
            $table->string('codigo_respuesta', 20)->nullable();
            $table->text('mensaje_sri')->nullable();

            // Archivos generados
            $table->string('xml_path')->nullable();            // XML firmado
            $table->string('xml_autorizado_path')->nullable(); // XML autorizado por el SRI
            $table->string('ride_path')->nullable();           // RIDE (PDF)

            $table->dateTime('fecha_envio')->nullable();
            $table->unsignedInteger('intentos_envio')->default(0);

            $table->foreignId('user_id')->nullable()->constrained('users')->nullOnDelete();
            $table->text('observaciones')->nullable();
            $table->timestamps();

            $table->index(['tipo_documento', 'estab', 'pto_emi']);
            $table->index('estado_sri');
            $table->index('fecha_emision');
        });

        // ---- Detalles de los comprobantes ----
        Schema::create('comprobante_detalles', function (Blueprint $table) {
            $table->id();
            $table->foreignId('comprobante_id')->constrained('comprobantes_electronicos')->cascadeOnDelete();

            // Línea de producto/servicio (Factura / NC / ND)
            $table->string('codigo_principal', 50)->nullable();
            $table->string('codigo_auxiliar', 50)->nullable();
            $table->string('descripcion');
            $table->decimal('cantidad', 14, 6)->default(0);
            $table->decimal('precio_unitario', 14, 6)->default(0);
            $table->decimal('descuento', 12, 2)->default(0);
            $table->decimal('precio_total_sin_impuesto', 12, 2)->default(0);

            // Impuesto IVA de la línea
            $table->string('impuesto_codigo', 1)->default('2');       // 2=IVA, 3=ICE, 5=IRBPNR
            $table->string('impuesto_codigo_porcentaje', 2)->nullable(); // 0,2,3,4,6,7,8
            $table->decimal('impuesto_tarifa', 5, 2)->default(0);
            $table->decimal('impuesto_base', 12, 2)->default(0);
            $table->decimal('impuesto_valor', 12, 2)->default(0);

            // Línea de retención (cuando el comprobante es 07)
            $table->boolean('es_retencion')->default(false);
            $table->string('ret_codigo', 1)->nullable();              // 1=Renta, 2=IVA, 6=ISD
            $table->string('ret_codigo_porcentaje', 5)->nullable();
            $table->decimal('ret_base_imponible', 12, 2)->nullable();
            $table->decimal('ret_porcentaje', 5, 2)->nullable();
            $table->decimal('ret_valor_retenido', 12, 2)->nullable();

            $table->timestamps();
        });

        // ---- Reconectar ventas con su comprobante electrónico ----
        Schema::table('ventas', function (Blueprint $table) {
            $table->foreignId('comprobante_electronico_id')->nullable()->after('turno_caja_id')
                  ->constrained('comprobantes_electronicos')->nullOnDelete();
        });
    }

    public function down(): void
    {
        if (Schema::hasColumn('ventas', 'comprobante_electronico_id')) {
            Schema::table('ventas', function (Blueprint $table) {
                $table->dropForeign(['comprobante_electronico_id']);
                $table->dropColumn('comprobante_electronico_id');
            });
        }

        Schema::dropIfExists('comprobante_detalles');
        Schema::dropIfExists('comprobantes_electronicos');
        Schema::dropIfExists('puntos_emision');

        Schema::table('empresas', function (Blueprint $table) {
            $table->dropColumn([
                'dir_matriz', 'dir_establecimiento', 'obligado_contabilidad',
                'contribuyente_especial', 'agente_retencion',
                'provincia', 'canton', 'parroquia',
                'sri_ambiente', 'sri_tipo_emision',
                'sri_certificado_path', 'sri_certificado_clave',
                'facturacion_electronica_activa',
            ]);
        });
    }
};
