<?php

namespace App\Services\Recruitment;

use App\Models\User;

class RecruitmentNavService
{
    public function canAccessModule(?User $user): bool
    {
        if (! $user) {
            return false;
        }

        return $user->hasPermission('recruitment_view')
            || $user->hasPermission('recruitment_refer')
            || $user->hasPermission('recruitment_referrals_view')
            || $this->canViewAssignedInterviews($user);
    }

    public function canViewAssignedInterviews(?User $user): bool
    {
        return $user
            && $user->isWorkforceMember()
            && $user->hasPermission('dashboard_view');
    }

    public function hasHrAccess(?User $user): bool
    {
        return $user && $user->hasPermission('recruitment_view');
    }

    public function canRefer(?User $user): bool
    {
        return $user
            && $user->isWorkforceMember()
            && ! $user->isTenantAdmin()
            && $user->hasPermission('recruitment_refer');
    }

    public function canTrackReferrals(?User $user): bool
    {
        return $user && (
            $user->hasPermission('recruitment_referrals_view')
            || $user->hasPermission('recruitment_refer')
        );
    }

    public function homeUrl(?User $user): string
    {
        if ($this->hasHrAccess($user)) {
            return route('recruitment.dashboard');
        }

        if ($this->canTrackReferrals($user)) {
            return route('recruitment.my-referrals');
        }

        if ($this->canRefer($user)) {
            return route('recruitment.open-roles');
        }

        if ($this->canViewAssignedInterviews($user)) {
            return route('recruitment.my-interviews');
        }

        return route('dashboard');
    }

    /**
     * @return list<array{label: string, route: string, active: bool, icon: string}>
     */
    public function submenuItems(?User $user): array
    {
        $items = [];

        if ($this->hasHrAccess($user)) {
            $items[] = [
                'label' => 'Dashboard',
                'route' => 'recruitment.dashboard',
                'icon' => 'bi-speedometer2',
                'active' => request()->routeIs('recruitment.dashboard'),
            ];
            $items[] = [
                'label' => 'Job postings',
                'route' => 'job-postings.index',
                'icon' => 'bi-bullseye',
                'active' => request()->routeIs('job-postings.*'),
            ];
            $items[] = [
                'label' => 'Applicants',
                'route' => 'applicants.index',
                'icon' => 'bi-people',
                'active' => request()->routeIs('applicants.index', 'applicants.show', 'applicants.create', 'applicants.edit'),
            ];
            $items[] = [
                'label' => 'Schedule Interview',
                'route' => 'interviews.index',
                'icon' => 'bi-calendar-event',
                'active' => request()->routeIs('interviews.*'),
            ];
        }

        if (! $this->hasHrAccess($user) && $this->canViewAssignedInterviews($user)) {
            $items[] = [
                'label' => 'Schedule Interview',
                'route' => 'recruitment.my-interviews',
                'icon' => 'bi-calendar-event',
                'active' => request()->routeIs('recruitment.my-interviews'),
            ];
        }

        if ($this->canRefer($user) || $this->hasHrAccess($user)) {
            $items[] = [
                'label' => 'Open roles',
                'route' => 'recruitment.open-roles',
                'icon' => 'bi-briefcase',
                'active' => request()->routeIs('recruitment.open-roles'),
            ];
        }

        if ($this->canRefer($user)) {
            $items[] = [
                'label' => 'Refer a candidate',
                'route' => 'applicants.refer',
                'icon' => 'bi-person-plus',
                'active' => request()->routeIs('applicants.refer', 'applicants.refer.store'),
            ];
        }

        if ($this->canTrackReferrals($user)) {
            $items[] = [
                'label' => 'My referrals',
                'route' => 'recruitment.my-referrals',
                'icon' => 'bi-diagram-3',
                'active' => request()->routeIs('recruitment.my-referrals*'),
            ];
        }

        return $items;
    }

    /**
     * @return list<array{key: string, label: string, route: ?string, url: string}>
     */
    public function mobileTabs(?User $user): array
    {
        $tabs = [];

        if ($this->hasHrAccess($user)) {
            $tabs[] = ['key' => 'dashboard', 'label' => 'Dashboard', 'route' => 'recruitment.dashboard'];
            $tabs[] = ['key' => 'applicants', 'label' => 'Applicants', 'route' => 'applicants.index'];
        }

        if ($this->canTrackReferrals($user)) {
            $tabs[] = ['key' => 'my_referrals', 'label' => 'My referrals', 'route' => 'recruitment.my-referrals'];
        }

        if ($this->canRefer($user) || $this->hasHrAccess($user)) {
            $tabs[] = ['key' => 'open_roles', 'label' => 'Open roles', 'route' => 'recruitment.open-roles'];
        }

        if ($this->canViewAssignedInterviews($user) && ! $this->hasHrAccess($user)) {
            $tabs[] = ['key' => 'interview_schedule', 'label' => 'Schedule Interview', 'route' => 'recruitment.my-interviews'];
        } elseif ($this->hasHrAccess($user)) {
            $tabs[] = ['key' => 'interview_schedule', 'label' => 'Schedule Interview', 'route' => 'interviews.index'];
        }

        return collect($tabs)->map(fn (array $tab) => [
            'key' => $tab['key'],
            'label' => $tab['label'],
            'route' => $tab['route'],
            'url' => route($tab['route']),
        ])->values()->all();
    }
}
