<?php

namespace App\Policies;

use App\Models\Leave;
use App\Models\User;

class LeavePolicy
{
    public function viewAny(User $user): bool
    {
        return $user->hasPermission('leaves_view');
    }

    public function create(User $user): bool
    {
        return $user->hasPermission('leaves_create');
    }

    public function view(User $user, Leave $leave): bool
    {
        if ((int) $leave->company_id !== (int) $user->company_id) {
            return false;
        }

        return in_array((int) $leave->user_id, $user->visibleStaffUserIds(), true);
    }

    public function update(User $user, Leave $leave): bool
    {
        if ((int) $leave->company_id !== (int) $user->company_id) {
            return false;
        }

        return (int) $leave->user_id === (int) $user->id && $leave->status === 'pending';
    }

    public function delete(User $user, Leave $leave): bool
    {
        return $this->update($user, $leave);
    }

    public function withdraw(User $user, Leave $leave): bool
    {
        if ((int) $leave->company_id !== (int) $user->company_id) {
            return false;
        }

        if ((int) $leave->user_id !== (int) $user->id) {
            return false;
        }

        return $leave->isWithdrawableBeforeStart();
    }

    public function approve(User $user, Leave $leave): bool
    {
        return $user->canApproveLeave($leave);
    }
}
