<?php

namespace App\Models\Scopes;

use App\Models\Company;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;

/**
 * Aísla automáticamente los registros por empresa actual.
 *
 * Comportamiento:
 *  - Sin auth (consola, jobs sin usuario) → no filtra (acceso total)
 *  - Usuario sin empresa → no ve nada
 *  - Usuario de operador (Fycls) viendo una empresa específica → filtra por esa
 *  - Usuario de operador con vista global → no filtra
 *  - Usuario normal → solo su empresa
 *
 * Para queries que necesiten omitir el scope (reportes globales, comandos, etc):
 *   Model::withoutGlobalScope(CompanyScope::class)->get();
 */
class CompanyScope implements Scope
{
    public function apply(Builder $builder, Model $model): void
    {
        // Si no hay usuario autenticado (consola, scheduler), no filtrar
        if (!auth()->check()) return;

        $user = auth()->user();

        // Operadores con modo global activo: no filtrar
        if ($user->isOperatorMember() && session('global_view', false)) {
            return;
        }

        // Operadores viendo una empresa específica: filtrar por sesión
        if ($user->isOperatorMember() && session()->has('current_company_id')) {
            $builder->where("{$model->getTable()}.company_id", session('current_company_id'));
            return;
        }

        // Usuario normal: filtrar por su empresa
        if ($user->company_id) {
            $builder->where("{$model->getTable()}.company_id", $user->company_id);
            return;
        }

        // Usuario sin empresa: no ve nada (registro fantasma)
        $builder->whereRaw('1=0');
    }
}
