<?php

namespace App\Models;

use App\Traits\MultiTenantScope;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\Pivot;
use Illuminate\Support\Facades\Auth;

/**
 * Pivot explícito para la relación supervisor ↔ collector.
 *
 * Aunque las relaciones en User.php usan belongsToMany (pivot implícito),
 * este modelo existe para:
 *   - Aplicar MultiTenantScope en consultas directas sobre supervisor_collector
 *   - Permitir queries como SupervisorCollector::where('supervisor_id', $id)->get()
 *   - Facilitar auditoría y futura extensión del pivot (ej. territorio, fecha)
 *
 * En las relaciones BelongsToMany de User.php se usa ->using(SupervisorCollector::class)
 * para que el pivot se maneje a través de este modelo.
 */
/**
 * Extiende Pivot (no Model) porque BelongsToMany->using() requiere fromRawAttributes().
 * Pivot extiende Model internamente, por lo que toda la funcionalidad de Model está disponible:
 * MultiTenantScope, relaciones, consultas directas, eventos creating/created, etc.
 */
class SupervisorCollector extends Pivot
{
    use MultiTenantScope;

    protected $table = 'supervisor_collector';

    // La tabla tiene id auto-increment ��� Pivot por defecto asume clave compuesta.
    public $incrementing = true;

    protected $keyType = 'int';

    // Pivot desactiva timestamps por defecto; nuestra tabla sí los tiene.
    public $timestamps = true;

    protected $fillable = [
        'company_id',
        'supervisor_id',
        'collector_id',
    ];

    // ------------------------------------------------------------------
    // Boot — protección de company_id
    // ------------------------------------------------------------------

    protected static function booted(): void
    {
        // BelongsToMany::attach() con ->using(SupervisorCollector::class) pasa por
        // attachUsingCustomClass() → newPivot()->save(), lo que dispara el evento
        // creating. Este listener garantiza que company_id nunca quede vacío incluso
        // si se llama attach() sin pasar el atributo explícitamente.
        //
        // Orden de prioridad para resolver company_id:
        //   1. El valor ya viene en los atributos del pivot → no hacer nada.
        //   2. Cargarlo desde el supervisor (fuente semánticamente correcta).
        //   3. Fallback a Auth::user()->company_id (ya lo hace MultiTenantScope,
        //      pero lo repetimos aquí por claridad si la traza llega hasta aquí).
        static::creating(function (SupervisorCollector $model): void {
            if (! empty($model->company_id)) {
                return;
            }

            if (! empty($model->supervisor_id)) {
                $supervisorCompanyId = User::where('id', $model->supervisor_id)
                    ->value('company_id');

                if ($supervisorCompanyId) {
                    $model->company_id = $supervisorCompanyId;

                    return;
                }
            }

            // Fallback final: usuario autenticado (cubre seeders y tests).
            if (Auth::check()) {
                $model->company_id = Auth::user()->company_id;
            }
        });
    }

    // ------------------------------------------------------------------
    // Relaciones
    // ------------------------------------------------------------------

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

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

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