<?php

namespace App\Http\Controllers\Web;

use App\Http\Controllers\Controller;
use App\Models\Appreciation;
use App\Models\Complaint;
use App\Models\Promotion;
use App\Models\Termination;
use App\Models\User;
use App\Models\Warning;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class EmployeeHrRecordsController extends Controller
{
    public function index(Request $request)
    {
        /** @var User $user */
        $user = Auth::user();
        abort_unless($user, 403);

        if ($user->hasPermission('hr_operations_view') || $user->isCompanyAccountAdmin()) {
            return redirect()->route('hr.dashboard');
        }

        abort_unless($this->canAccessOwnRecords($user), 403);

        $warnings = Warning::query()
            ->where('user_id', $user->id)
            ->orderByDesc('warning_date')
            ->limit(20)
            ->get();

        $appreciations = Appreciation::query()
            ->with('givenByUser')
            ->where('user_id', $user->id)
            ->orderByDesc('appreciation_date')
            ->limit(20)
            ->get();

        $raisedComplaints = Complaint::query()
            ->with('againstUser')
            ->where('from_user_id', $user->id)
            ->orderByDesc('complaint_date')
            ->limit(20)
            ->get();

        $promotions = Promotion::query()
            ->with(['fromDesignation', 'toDesignation', 'fromDepartment', 'toDepartment'])
            ->where('user_id', $user->id)
            ->orderByDesc('promotion_date')
            ->limit(20)
            ->get();

        $terminations = Termination::query()
            ->where('user_id', $user->id)
            ->orderByDesc('termination_date')
            ->limit(20)
            ->get();

        $kpis = [
            'warnings' => Warning::query()->where('user_id', $user->id)->count(),
            'appreciations' => Appreciation::query()->where('user_id', $user->id)->count(),
            'complaints_against_me' => Complaint::query()->where('against_user_id', $user->id)->count(),
            'complaints_raised' => Complaint::query()->where('from_user_id', $user->id)->count(),
            'promotions' => Promotion::query()->where('user_id', $user->id)->count(),
            'terminations' => Termination::query()->where('user_id', $user->id)->count(),
        ];

        $canRaiseComplaint = $user->hasPermission('complaints_create_own');
        $complaintUsers = $canRaiseComplaint
            ? User::query()
                ->forActiveDirectory()
                ->where('company_id', $user->company_id)
                ->where('id', '!=', $user->id)
                ->orderBy('name')
                ->get(['id', 'name'])
            : collect();

        return view('hr.my-records', compact(
            'kpis',
            'warnings',
            'appreciations',
            'raisedComplaints',
            'promotions',
            'terminations',
            'canRaiseComplaint',
            'complaintUsers'
        ));
    }

    protected function canAccessOwnRecords(User $user): bool
    {
        return $user->hasPermission('complaints_view_own')
            || $user->hasPermission('warnings_view_own')
            || $user->hasPermission('appreciations_view_own')
            || $user->hasPermission('promotions_view_own')
            || $user->hasPermission('terminations_view_own');
    }
}
