<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\HasOne;

class Caso extends Model
{
    protected $fillable = [
        'tenant_id',
        'numero_reclamo',
        'numero_caso_sias',
        'numero_caso_wan_ax',
        'fecha_siniestro',
        'fecha_asignacion',
        'fecha_inspeccion',
        'fecha_cierre',
        'cobertura',
        'estado_actual',
        'observaciones',
        'cuadro_comparativo_path',
        'recepcion_impar',
        'categoria_documento',
        'tipo_ajuste',
        'tipo_ajuste_carga',
        'tiempo_total_minutos',
        'link_fotos',
        'link_informe',
        'nivel_dano',
        'aplica_kilometraje',
        'kilometros',
        'tarifa_kilometro',
        'ciudad_destino',
        'tipo_contrato',
        'afectado_nombre',
        'afectado_email',
        'afectado_telefono',
        'valor_kilometraje',
        'tarifa_ajuste',
        'ramo',
        'aseguradora_razon_social',
        'aseguradora_ruc',
        'aseguradora_ciudad',
        'aseguradora_ejecutivo_nombre',
        'broker_razon_social',
        'broker_ruc',
        'broker_email',
        'broker_telefono',
        'broker_nro_reclamo',
        'broker_fecha_siniestro',
        'ejecutivo_email',
        'ejecutivo_celular',
        'particular_tipo_identificacion',
        'particular_ciudad',
        'cuadro_comparativo_path',
        'recepcion_impar',
        'token_aprobacion',
        'token_expira_en',
        'aprobacion_estado',
        'tipo_compra_taller',
        'sub_tipo_ajuste',
        'particular_nombre',
        'particular_email',
        'pago_estado',
        'broker_ejecutivo',
        'taller_ruc',
        'taller_ejecutivo',
        'taller_email',
        'taller_telefono',
        'honorario_perito',
        'tarifa_ajustador_valor',
        'estado_coordinacion',
        'particular_telefono',
        'particular_identificacion',
        'particular_tipo_identificacion',
        'particular_ciudad',
        'aviso_siniestro_path',
        'ajustador_archivos',
        'informe_data',
        'informe_enviado',
        'informe_enviado_at',
        'direccion_inspeccion',
        'lat_inspeccion',
        'lng_inspeccion',
        'confirmo_llegada',
        'confirmo_llegada_at',
        'cliente_id',
        'vehiculo_id',
        'aseguradora_id',
        'broker_id',
        'taller_id',
        'ajustador_id',
        'ejecutivo_id',
        'director_id',
        'reinspector_id',
    ];

    protected $casts = [
        'fecha_siniestro' => 'date',
        'fecha_asignacion' => 'date',
        'fecha_cierre' => 'date',
        'aplica_kilometraje' => 'boolean',
        'tarifa_kilometro' => 'decimal:4',
        'tiempo_total_minutos' => 'integer',
        'token_expira_en' => 'datetime',
        'aviso_siniestro_path' => 'array',
        'ajustador_archivos' => 'array',
        'informe_data' => 'array',
        'informe_enviado' => 'boolean',
        'informe_enviado_at' => 'datetime',
        'confirmo_llegada' => 'boolean',
        'confirmo_llegada_at' => 'datetime',
    ];

    public const ESTADOS = [
        'pendiente_coordinacion' => 'Pendiente Coordinación',
        'coordinado' => 'Coordinado',
        'caso_en_ruta' => 'Caso en Ruta',
        'recoordinacion' => 'Recordinación',
        'no_contesta' => 'No Contesta',
        'llamar_despues' => 'Llamar Después',
        'pendiente_proforma_cliente' => 'Pendiente Proforma Cliente',
        'pendiente_proforma_taller' => 'Pendiente Proforma Taller',
        'pendiente_aviso_siniestro' => 'Pendiente Aviso Siniestro',
        'vehiculo_retenido' => 'Vehículo Retenido',
        'vehiculo_circulando' => 'Vehículo Circulando',
        'vehiculo_no_taller' => 'Vehículo NO en Taller',
        'analisis' => 'Análisis del Caso',
        'inspeccion_realizada' => 'Inspección Realizada',
        'inspeccion_no_realizada' => 'Inspección No Realizada',
        'elaboracion_informe' => 'Elaboración Informe',
        'confirmacion_cobertura' => 'Confirmación Cobertura',
        'autorizacion_inspector' => 'Autorización Inspector',
        'autorizacion_reinspector' => 'Autorización Reinspector',
        'autorizacion_ejecutivo' => 'Autorización Ejecutivo',
        'autorizacion_director' => 'Autorización Director',
        'autorizacion_gerente' => 'Autorización Gerente',
        'no_confirma_cobertura' => 'No Confirma Cobertura',
        'envio_informe' => 'Envío Informe',
        'recibe_informe' => 'Recibe Informe',
        'rechazo_reinspector' => 'Rechazo Reinspector',
        'ajuste_finalizado' => 'Ajuste Finalizado',
        'mesa_compras' => 'Mesa de Compras',
        'en_reparacion' => 'En Reparación',
        'alcance' => 'Alcance',
        'facturacion' => 'Facturación',
        'finalizado' => 'Finalizado',
        'rechazado' => 'Rechazado',
        'pendiente_respuesta_ejecutivo' => 'Pendiente Respuesta Ejecutivo',
    ];

    public function tenant(): BelongsTo
    {
        return $this->belongsTo(Tenant::class);
    }

    public function cliente(): BelongsTo
    {
        return $this->belongsTo(Cliente::class);
    }

    public function vehiculo(): BelongsTo
    {
        return $this->belongsTo(Vehiculo::class);
    }

    public function aseguradora(): BelongsTo
    {
        return $this->belongsTo(Tenant::class, 'aseguradora_id');
    }

    public function broker(): BelongsTo
    {
        return $this->belongsTo(Broker::class);
    }

    public function taller(): BelongsTo
    {
        return $this->belongsTo(Taller::class);
    }

    public function ajustador(): BelongsTo
    {
        return $this->belongsTo(Ajustador::class);
    }

    public function ejecutivo(): BelongsTo
    {
        return $this->belongsTo(PersonalZurich::class, 'ejecutivo_id');
    }

    public function director(): BelongsTo
    {
        return $this->belongsTo(PersonalZurich::class, 'director_id');
    }

    public function reinspector(): BelongsTo
    {
        return $this->belongsTo(PersonalZurich::class, 'reinspector_id');
    }

    public function estadosHistoricos(): HasMany
    {
        return $this->hasMany(EstadoHistorico::class);
    }

    public function cotizaciones(): HasMany
    {
        return $this->hasMany(Cotizacion::class);
    }

    public function facturas(): HasMany
    {
        return $this->hasMany(Factura::class);
    }

    public function notificaciones(): HasMany
    {
        return $this->hasMany(Notificacion::class);
    }

    public function seguimientoReparacion(): HasOne
    {
        return $this->hasOne(SeguimientoReparacion::class);
    }

    public function documentoLogs(): HasMany
    {
        return $this->hasMany(DocumentoLog::class);
    }

    public function scheduledNotifications(): HasMany
    {
        return $this->hasMany(ScheduledNotification::class);
    }

    /**
     * Check if this case's state is a coordination sub-state
     * that should return it to the coordination screen.
     */
    public function isSubEstadoCoordinacion(): bool
    {
        return in_array($this->estado_actual, [
            'recoordinacion',
            'no_contesta',
            'llamar_despues',
            'pendiente_respuesta_ejecutivo',
            'pendiente_proforma_cliente',
            'pendiente_proforma_taller',
            'pendiente_aviso_siniestro',
            'vehiculo_retenido',
            'vehiculo_circulando',
            'vehiculo_no_taller',
        ]);
    }

    public function getEstadoLabelAttribute(): string
    {
        return self::ESTADOS[$this->estado_actual] ?? $this->estado_actual;
    }
}
