<?php

namespace App\Http\Controllers\Web;

use App\Http\Controllers\Controller;
use App\Models\Applicant;
use App\Services\Recruitment\ApplicantScopeService;
use App\Services\Recruitment\ReferralProgressService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class MyReferralsController extends Controller
{
    public function __construct(
        protected ApplicantScopeService $scope,
        protected ReferralProgressService $progress
    ) {}

    public function index(Request $request)
    {
        $user = Auth::user();
        abort_unless($this->scope->canViewOwnReferrals($user), 403);

        $status = (string) $request->query('status', 'active');
        $jobPostingId = (int) $request->query('job_posting_id');

        $query = $this->scope->scopedQuery($user)
            ->with('jobPosting:id,title')
            ->whereNotNull('referred_by_user_id')
            ->when($jobPostingId > 0, fn ($q) => $q->where('job_posting_id', $jobPostingId))
            ->when($status === 'active', fn ($q) => $q->whereNotIn('stage', ['rejected', 'offer']))
            ->when($status === 'closed', fn ($q) => $q->whereIn('stage', ['rejected', 'offer']))
            ->orderByDesc('created_at');

        $referrals = $query->paginate(12)->withQueryString();

        $base = $this->scope->scopedQuery($user)->whereNotNull('referred_by_user_id');
        $stats = [
            'total' => (clone $base)->count(),
            'in_progress' => (clone $base)->whereNotIn('stage', ['rejected', 'offer'])->count(),
            'offer' => (clone $base)->where('stage', 'offer')->count(),
            'rejected' => (clone $base)->where('stage', 'rejected')->count(),
        ];

        $jobPostings = Applicant::query()
            ->where('referred_by_user_id', $user->id)
            ->with('jobPosting:id,title')
            ->get()
            ->pluck('jobPosting')
            ->filter()
            ->unique('id')
            ->sortBy('title')
            ->values();

        return view('recruitment.my-referrals.index', compact('referrals', 'stats', 'status', 'jobPostings'));
    }

    public function show(Applicant $applicant)
    {
        $user = Auth::user();
        abort_unless((int) $applicant->referred_by_user_id === (int) $user->id, 403);

        $applicant->load(['jobPosting', 'stageEvents' => fn ($q) => $q->orderBy('created_at')]);

        $progress = $this->progress->build($applicant);
        $timeline = $applicant->stageEvents->values();

        return view('recruitment.my-referrals.show', compact('applicant', 'progress', 'timeline'));
    }
}
