<?php

namespace App\Traits;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Schema;

trait MultiTenantScope
{
    public static function bootMultiTenantScope(): void
    {
        static::creating(function (Model $model) {
            // No tocar nada si no hay sesión o si no existe la columna.
            if (! Auth::check()) {
                return;
            }

            if (! self::modelHasCompanyColumn($model)) {
                return;
            }

            // getAttribute/setAttribute en vez de la propiedad mágica: el closure
            // recibe un Model genérico y PHPStan no puede saber que tiene company_id.
            if (empty($model->getAttribute('company_id'))) {
                $model->setAttribute('company_id', Auth::user()->company_id);
            }
        });

        static::addGlobalScope('company', function (Builder $builder) {
            // No aplicar en consola, seeders, etc.
            if (app()->runningInConsole()) {
                return;
            }

            $user = Auth::user();
            if (! $user) {
                return;
            }

            // Los super_admin ven todo
            if (method_exists($user, 'isSuperAdmin') && $user->isSuperAdmin()) {
                return;
            }

            $model = $builder->getModel();

            if (! self::modelHasCompanyColumn($model)) {
                return;
            }

            $table = $model->getTable();

            $builder->where($table.'.company_id', $user->company_id);
        });
    }

    protected static function modelHasCompanyColumn(Model $model): bool
    {
        try {
            return Schema::hasColumn($model->getTable(), 'company_id');
        } catch (\Throwable $e) {
            return false;
        }
    }
}
