<?php

namespace App\Http\Controllers\Web;

use App\Http\Controllers\Controller;
use App\Models\User;
use App\Models\Warning;
use App\Notifications\WarningIssuedNotification;
use App\Support\FormTextRules;
use Illuminate\Http\Request;

class WarningController extends Controller
{
    public function index()
    {
        /** @var User $user */
        $user = auth()->user();
        $canManage = $this->canManageWarnings($user);

        if (! $canManage) {
            return redirect()->to(route('my-hr-records.index') . '#warnings');
        }

        $query = Warning::with('user');
        $kpis = $this->buildKpis($user, $canManage);
        $warnings = $query->orderByDesc('warning_date')->paginate(15);

        return view('hr.warnings', compact('warnings', 'canManage', 'kpis'));
    }

    public function create()
    {
        abort_unless($this->canManageWarnings(auth()->user()), 403);

        $users = User::forActiveDirectory();
        if (auth()->user()->company_id) {
            $users->where('company_id', auth()->user()->company_id);
        }
        $users = $users->orderBy('name')->get();

        return view('hr.warnings-create', compact('users'));
    }

    public function store(Request $request)
    {
        abort_unless($this->canManageWarnings(auth()->user()), 403);

        $validated = $request->validate([
            'user_id' => 'required|exists:users,id',
            'subject' => FormTextRules::notNumericOnly(true, 191),
            'description' => 'nullable|string|max:2000',
            'warning_date' => 'required|date',
            'severity' => 'nullable|in:low,medium,high',
        ], FormTextRules::messages());
        $validated['severity'] = $validated['severity'] ?? 'medium';
        $validated['company_id'] = auth()->user()->company_id;

        $warning = Warning::create($validated);
        $warning->load('user');

        if ($warning->user && (int) $warning->user_id !== (int) auth()->id()) {
            $warning->user->notify(new WarningIssuedNotification($warning));
        }

        return redirect()->route('warnings.index')->with('success', 'Warning recorded successfully.');
    }

    /**
     * @return array<string, int>
     */
    protected function buildKpis(?User $user, bool $canManage): array
    {
        if (! $user) {
            return [];
        }

        $base = Warning::query();
        if (! $canManage) {
            $base->where('user_id', $user->id);
        }

        return [
            'total' => (clone $base)->count(),
            'high' => (clone $base)->where('severity', 'high')->count(),
            'medium' => (clone $base)->where('severity', 'medium')->count(),
            'low' => (clone $base)->where('severity', 'low')->count(),
        ];
    }

    protected function canManageWarnings(?User $user): bool
    {
        if (! $user) {
            return false;
        }

        if ($user->isCompanyAccountAdmin()) {
            return true;
        }

        return $user->hasPermission('hr_operations_view');
    }
}
