<?php

namespace App\Policies;

use App\Models\Applicant;
use App\Models\Interview;
use App\Models\User;
use App\Services\Recruitment\ApplicantScopeService;

class ApplicantPolicy
{
    public function viewAny(User $user): bool
    {
        $scope = app(ApplicantScopeService::class);

        return $scope->canViewFullPipeline($user) || $scope->canViewOwnReferrals($user);
    }

    public function view(User $user, Applicant $applicant): bool
    {
        return app(ApplicantScopeService::class)->userCanView($user, $applicant);
    }

    public function create(User $user): bool
    {
        return $user->hasPermission('recruitment_create');
    }

    public function update(User $user, Applicant $applicant): bool
    {
        return (int) $applicant->company_id === (int) $user->company_id
            && $user->hasPermission('recruitment_edit');
    }

    public function delete(User $user, Applicant $applicant): bool
    {
        return (int) $applicant->company_id === (int) $user->company_id
            && $user->hasPermission('recruitment_delete');
    }

    public function downloadResume(User $user, Applicant $applicant): bool
    {
        if ((int) $applicant->company_id !== (int) $user->company_id) {
            return false;
        }

        if ($user->hasPermission('recruitment_view')) {
            return true;
        }

        if (app(ApplicantScopeService::class)->userCanView($user, $applicant)) {
            return true;
        }

        return Interview::query()
            ->where('applicant_id', $applicant->id)
            ->where('interviewer_id', $user->id)
            ->exists();
    }
}
