<?php

namespace App\Http\Controllers\Web;

use App\Http\Controllers\Controller;
use App\Models\Offboarding;
use App\Models\OffboardingChecklistItem;
use App\Models\User;
use App\Services\Hr\OffboardingWorkflowService;
use Illuminate\Http\Request;

class OffboardingController extends Controller
{
    public function __construct(
        protected OffboardingWorkflowService $workflow
    ) {}

    public function index()
    {
        $offboardings = Offboarding::with(['user', 'fnfSettlement'])
            ->orderByDesc('offboarding_date')
            ->paginate(15);

        return view('hr.offboardings', compact('offboardings'));
    }

    public function create()
    {
        $users = User::forActiveDirectory();
        if (auth()->user()->company_id) {
            $users->where('company_id', auth()->user()->company_id);
        }
        $users = $users->orderBy('name')->get();

        return view('hr.offboardings-create', compact('users'));
    }

    public function store(Request $request)
    {
        $validated = $request->validate([
            'user_id' => 'required|exists:users,id',
            'offboarding_date' => 'required|date',
            'last_working_date' => 'nullable|date|after_or_equal:offboarding_date',
            'notice_period_days' => 'nullable|integer|min:0|max:180',
            'type' => 'required|in:resignation,termination,retirement,contract_end,other',
            'reason' => 'nullable|string|max:1000',
            'notes' => 'nullable|string|max:1000',
        ]);

        $validated['company_id'] = auth()->user()->company_id;
        $validated['last_working_date'] = $validated['last_working_date'] ?? $validated['offboarding_date'];
        $validated['notice_period_days'] = $validated['notice_period_days'] ?? 30;
        $validated['status'] = Offboarding::STATUS_IN_PROGRESS;

        $offboarding = Offboarding::create($validated);
        $this->workflow->initiate($offboarding);

        return redirect()
            ->route('offboardings.show', $offboarding)
            ->with('success', 'Offboarding initiated with clearance checklist and F&F draft.');
    }

    public function show(Offboarding $offboarding)
    {
        $this->authorizeCompany($offboarding);
        $offboarding->load(['user', 'checklistItems.assignee', 'fnfSettlement']);

        $assignedAssets = \App\Models\Asset::query()
            ->where('assigned_to', $offboarding->user_id)
            ->where('status', 'assigned')
            ->get();

        return view('hr.offboardings-show', compact('offboarding', 'assignedAssets'));
    }

    public function updateChecklist(Request $request, OffboardingChecklistItem $item)
    {
        $offboarding = $item->offboarding;
        $this->authorizeCompany($offboarding);

        $validated = $request->validate([
            'status' => 'required|in:pending,completed,waived,na',
            'notes' => 'nullable|string|max:1000',
        ]);

        $this->workflow->updateChecklistItem(
            $item,
            $validated['status'],
            $validated['notes'] ?? null,
            (int) auth()->id()
        );

        return back()->with('success', 'Checklist item updated.');
    }

    protected function authorizeCompany(Offboarding $offboarding): void
    {
        $companyId = auth()->user()?->company_id;
        if ($companyId && (int) $offboarding->company_id !== (int) $companyId) {
            abort(403);
        }
    }
}
