<?php

namespace App\Policies;

use App\Models\Offboarding;
use App\Models\OffboardingChecklistItem;
use App\Models\User;

class OffboardingPolicy
{
    public function viewAny(User $user): bool
    {
        return $user->hasPermission('hr_operations_view');
    }

    public function view(User $user, Offboarding $offboarding): bool
    {
        if ((int) $offboarding->company_id !== (int) $user->company_id) {
            return false;
        }

        if ($user->hasPermission('hr_operations_view')) {
            return true;
        }

        return (int) $offboarding->user_id === (int) $user->id;
    }

    public function create(User $user): bool
    {
        return $user->hasPermission('hr_operations_create') || $user->hasPermission('hr_operations_view');
    }

    public function updateChecklistItem(User $user, OffboardingChecklistItem $item): bool
    {
        $offboarding = $item->offboarding;
        if (! $offboarding || (int) $offboarding->company_id !== (int) $user->company_id) {
            return false;
        }

        if ($user->hasPermission('hr_operations_edit') || $user->isTenantHr() || $user->isTenantAdmin()) {
            return true;
        }

        if ((int) $item->assigned_to === (int) $user->id) {
            return true;
        }

        $employee = $offboarding->user;
        if ($employee && $item->category === 'manager' && $user->isReportingManagerOf($employee)) {
            return true;
        }

        return $this->canHandleChecklistCategory($user, (string) $item->category);
    }

    protected function canHandleChecklistCategory(User $user, string $category): bool
    {
        return match ($category) {
            'finance' => $user->hasPermission('finance_edit')
                || $user->hasPermission('finance_operational')
                || $user->hasPermission('finance_view'),
            'assets' => $user->hasPermission('assets_edit') || $user->hasPermission('assets_view'),
            'it', 'docs' => $user->hasPermission('hr_operations_view'),
            'hr' => $user->isTenantHr() || $user->hasPermission('hr_operations_edit'),
            'manager' => $user->isTenantManager(),
            default => false,
        };
    }
}
