<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

/**
 * Comprobante electrónico del SRI (Ecuador).
 *
 * Representa una Factura (01), Nota de Crédito (04), Nota de Débito (05)
 * o Comprobante de Retención (07) emitido bajo el esquema de facturación
 * electrónica del Servicio de Rentas Internas.
 */
class ComprobanteElectronico extends Model
{
    use HasFactory;

    protected $table = 'comprobantes_electronicos';

    protected $fillable = [
        'venta_id',
        'tipo_documento', 'ambiente', 'tipo_emision',
        'estab', 'pto_emi', 'secuencial', 'numero_completo',
        'clave_acceso', 'codigo_numerico',
        'emisor_ruc', 'emisor_razon_social', 'emisor_nombre_comercial',
        'emisor_dir_matriz', 'emisor_dir_establecimiento',
        'obligado_contabilidad', 'contribuyente_especial',
        'receptor_tipo_identificacion', 'receptor_identificacion',
        'receptor_razon_social', 'receptor_direccion', 'receptor_email', 'receptor_telefono',
        'fecha_emision', 'moneda',
        'total_sin_impuestos', 'total_descuento', 'total_ice', 'total_iva',
        'propina', 'importe_total',
        'cod_doc_modificado', 'num_doc_modificado', 'fecha_emision_doc_sustento',
        'motivo', 'valor_modificacion',
        'periodo_fiscal', 'doc_sustento_tipo', 'doc_sustento_numero',
        'doc_sustento_fecha', 'total_retenido',
        'estado_sri', 'numero_autorizacion', 'fecha_autorizacion',
        'codigo_respuesta', 'mensaje_sri',
        'xml_path', 'xml_autorizado_path', 'ride_path',
        'fecha_envio', 'intentos_envio',
        'user_id', 'observaciones',
    ];

    protected $casts = [
        'fecha_emision' => 'date',
        'fecha_emision_doc_sustento' => 'date',
        'doc_sustento_fecha' => 'date',
        'fecha_autorizacion' => 'datetime',
        'fecha_envio' => 'datetime',
        'total_sin_impuestos' => 'decimal:2',
        'total_descuento' => 'decimal:2',
        'total_ice' => 'decimal:2',
        'total_iva' => 'decimal:2',
        'propina' => 'decimal:2',
        'importe_total' => 'decimal:2',
        'valor_modificacion' => 'decimal:2',
        'total_retenido' => 'decimal:2',
        'intentos_envio' => 'integer',
    ];

    /** Tipos de comprobante del SRI */
    public const TIPOS = [
        '01' => 'Factura',
        '04' => 'Nota de Crédito',
        '05' => 'Nota de Débito',
        '07' => 'Comprobante de Retención',
    ];

    /** Tipos de identificación del receptor (SRI) */
    public const TIPOS_IDENTIFICACION = [
        '04' => 'RUC',
        '05' => 'Cédula',
        '06' => 'Pasaporte',
        '07' => 'Consumidor Final',
        '08' => 'Identificación del Exterior',
    ];

    /** Motivos frecuentes para Notas de Crédito */
    public const MOTIVOS_NC = [
        'Anulación de la factura',
        'Devolución total de la mercadería',
        'Devolución parcial de la mercadería',
        'Descuento por pronto pago',
        'Corrección de valores',
        'Otros',
    ];

    /** Ambientes del SRI */
    public const AMBIENTES = [
        '1' => 'Pruebas',
        '2' => 'Producción',
    ];

    public function venta()
    {
        return $this->belongsTo(Venta::class);
    }

    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function detalles()
    {
        return $this->hasMany(ComprobanteDetalle::class, 'comprobante_id');
    }

    /* ----------------- Accessors ----------------- */

    public function getTipoDocumentoNombreAttribute(): string
    {
        return self::TIPOS[$this->tipo_documento] ?? 'Desconocido';
    }

    public function getAmbienteNombreAttribute(): string
    {
        return self::AMBIENTES[$this->ambiente] ?? 'Desconocido';
    }

    public function getReceptorTipoLabelAttribute(): string
    {
        return self::TIPOS_IDENTIFICACION[$this->receptor_tipo_identificacion] ?? '-';
    }

    public function getEstadoColorAttribute(): string
    {
        return match ($this->estado_sri) {
            'AUTORIZADO' => 'green',
            'RECIBIDA', 'ENVIADO', 'FIRMADO' => 'blue',
            'CREADO' => 'yellow',
            'DEVUELTA' => 'orange',
            'NO_AUTORIZADO', 'RECHAZADO', 'EXCEPCION' => 'red',
            default => 'slate',
        };
    }

    /** Mensajes del SRI decodificados (se guardan como JSON) */
    public function getMensajesAttribute(): array
    {
        if (!$this->mensaje_sri) {
            return [];
        }
        $data = json_decode($this->mensaje_sri, true);
        return is_array($data) ? $data : [['mensaje' => $this->mensaje_sri]];
    }

    /* ----------------- Scopes ----------------- */

    public function scopeFacturas($q)
    {
        return $q->where('tipo_documento', '01');
    }

    public function scopeNotasCredito($q)
    {
        return $q->where('tipo_documento', '04');
    }

    public function scopeNotasDebito($q)
    {
        return $q->where('tipo_documento', '05');
    }

    public function scopeRetenciones($q)
    {
        return $q->where('tipo_documento', '07');
    }

    public function scopeAutorizados($q)
    {
        return $q->where('estado_sri', 'AUTORIZADO');
    }
}
