<?php

namespace App\Models;

use App\Traits\MultiTenantScope;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class CollectionVisit extends Model
{
    use MultiTenantScope;

    /*=========================================================
    | CONSTANTES - TIPOS DE VISITA
    =========================================================*/
    public const TYPE_NO_PAYMENT = 'no_payment';

    public const TYPE_FOLLOW_UP = 'follow_up';

    public const TYPE_PROMISE = 'promise';

    public const TYPE_OTHER = 'other';

    public const VISIT_TYPES = [
        self::TYPE_NO_PAYMENT,
        self::TYPE_FOLLOW_UP,
        self::TYPE_PROMISE,
        self::TYPE_OTHER,
    ];

    /*=========================================================
    | CONSTANTES - MOTIVOS DE NO PAGO
    =========================================================*/
    public const REASON_NOT_HOME = 'not_home';

    public const REASON_NO_MONEY = 'no_money';

    public const REASON_WILL_PAY_LATER = 'will_pay_later';

    public const REASON_REFUSED = 'refused';

    public const REASON_PARTIAL_PROMISE = 'partial_promise';

    public const REASON_OTHER = 'other';

    public const REASONS = [
        self::REASON_NOT_HOME,
        self::REASON_NO_MONEY,
        self::REASON_WILL_PAY_LATER,
        self::REASON_REFUSED,
        self::REASON_PARTIAL_PROMISE,
        self::REASON_OTHER,
    ];

    protected $fillable = [
        'company_id',
        'credit_id',
        'installment_id',
        'collector_user_id',
        'visit_type',
        'reason',
        'notes',
        'promised_date',
        'promised_amount',
        'visit_date',
        'visit_time',
        'latitude',
        'longitude',
        'device_id',
        'idempotency_key',
    ];

    protected $casts = [
        'visit_date' => 'date',
        'promised_date' => 'date',
        'promised_amount' => 'decimal:2',
        'latitude' => 'decimal:7',
        'longitude' => 'decimal:7',
    ];

    /*=========================================================
    | RELACIONES
    =========================================================*/
    public function company(): BelongsTo
    {
        return $this->belongsTo(Company::class);
    }

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

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

    public function collector(): BelongsTo
    {
        return $this->belongsTo(User::class, 'collector_user_id');
    }

    /*=========================================================
    | LABELS PARA UI
    =========================================================*/
    public function getVisitTypeLabel(): string
    {
        return match ($this->visit_type) {
            self::TYPE_NO_PAYMENT => 'No paga hoy',
            self::TYPE_FOLLOW_UP => 'Seguimiento',
            self::TYPE_PROMISE => 'Promesa de pago',
            self::TYPE_OTHER => 'Otro',
            default => ucfirst($this->visit_type),
        };
    }

    public function getReasonLabel(): string
    {
        return match ($this->reason) {
            self::REASON_NOT_HOME => 'No estaba en casa',
            self::REASON_NO_MONEY => 'Sin dinero',
            self::REASON_WILL_PAY_LATER => 'Pide volver después',
            self::REASON_REFUSED => 'Rechazó pagar',
            self::REASON_PARTIAL_PROMISE => 'Promete pago parcial',
            self::REASON_OTHER => 'Otro motivo',
            default => $this->reason ?? 'N/A',
        };
    }
}
