<?php

namespace App\Models;

use App\Traits\MultiTenantScope;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\HasOne;

class Client extends Model
{
    use HasFactory, MultiTenantScope;

    protected $fillable = [
        'company_id',
        'name',
        'identification',
        'email',
        'phone',
        'is_active',
        'created_by_user_id',
        'preferred_payment_method', // <--- NUEVO: Añadido para la migración
    ];

    protected $casts = [
        'is_active' => 'boolean',
    ];

    // Relación Multi-Tenant
    public function company(): BelongsTo
    {
        return $this->belongsTo(Company::class);
    }

    // El cliente tiene muchas direcciones
    public function addresses(): HasMany
    {
        return $this->hasMany(ClientAddress::class);
    }

    // El cliente tiene muchos créditos
    public function credits(): HasMany
    {
        return $this->hasMany(Credit::class);
    }

    // Obtiene la dirección principal (para fácil acceso)
    /**
     * @return HasOne<ClientAddress, $this>
     */
    public function primaryAddress(): HasOne
    {
        return $this->hasOne(ClientAddress::class)->where('is_primary', true);
    }

    /**
     * Dirección legible del cliente — FUENTE ÚNICA para la PWA (cards de cobro,
     * sync, detalle). Usa la dirección principal o, si ninguna está marcada como
     * tal, la primera registrada (tolera datos sin `is_primary`, p. ej. creados
     * desde Filament sin marcarla). Requiere la relación `addresses` cargada.
     */
    protected function formattedAddress(): Attribute
    {
        return Attribute::make(
            get: function (): string {
                $address = $this->addresses->firstWhere('is_primary', true)
                    ?? $this->addresses->first();

                return $address instanceof ClientAddress ? $address->full_address : '';
            }
        );
    }

    // Usuario que lo creó (para trazabilidad)
    public function creator(): BelongsTo
    {
        return $this->belongsTo(User::class, 'created_by_user_id');
    }
}
