<?php

namespace App\Models\Scopes;

use App\Services\CompanyResolver;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;
use Illuminate\Support\Facades\Auth;

class CompanyScope implements Scope
{
    public function __construct(
        protected CompanyResolver $companyResolver
    ) {}

    public function apply(Builder $builder, Model $model): void
    {
        if ($this->shouldApply($model)) {
            $companyId = $this->companyResolver->getCompanyId();
            if ($companyId !== null) {
                $builder->where($model->getTable() . '.company_id', $companyId);
            }
        }
    }

    protected function shouldApply(Model $model): bool
    {
        if (! in_array('company_id', $model->getFillable(), true) && ! array_key_exists('company_id', $model->getCasts())) {
            $cols = $model->getConnection()->getSchemaBuilder()->getColumnListing($model->getTable());
            if (! in_array('company_id', $cols ?? [], true)) {
                return false;
            }
        }

        $user = Auth::user();
        if (! $user) {
            return false;
        }

        if ($user->is_superadmin ?? false) {
            return false;
        }

        return true;
    }
}
