<?php

namespace App\Http\Controllers\Api;

use App\Classes\Payrolls;
use App\Http\Controllers\ApiBaseController;
use App\Http\Requests\Api\AttendanceRegularization\IndexRequest;
use App\Http\Requests\Api\AttendanceRegularization\StoreRequest;
use App\Http\Requests\Api\AttendanceRegularization\UpdateRequest;
use App\Http\Requests\Api\AttendanceRegularization\DeleteRequest;
use App\Models\Attendance;
use App\Models\AttendanceRegularization;
use App\Models\Payroll;
use Examyou\RestAPI\ApiResponse;
use Examyou\RestAPI\Exceptions\ApiException;

class AttendanceRegularizationController extends ApiBaseController
{
    protected $model = AttendanceRegularization::class;

    protected $indexRequest = IndexRequest::class;
    protected $storeRequest = StoreRequest::class;
    protected $updateRequest = UpdateRequest::class;
    protected $deleteRequest = DeleteRequest::class;

    public function modifyIndex($query)
    {
        $request = request();

        // Status filter
        if ($request->has('status') && $request->status !== '' && $request->status !== 'all') {
            $query->where('attendance_regularizations.status', $request->status);
        }
        // Filter by user_id 
        if ($request->has('user_id') && !empty($request->user_id)) {
            $userId = $this->getIdFromHash($request->user_id);
            $query->where('attendance_regularizations.user_id', $userId);
        }

        if ($request->has('date') && !empty($request->date)) {
            $dates = explode(',', $request->date);

            if (count($dates) === 2) {
                $startDate = trim($dates[0]);
                $endDate = trim($dates[1]);

                $query->whereBetween('attendance_regularizations.date', [$startDate, $endDate]);
            }
        }

        return $query;
    }

    public function storing(AttendanceRegularization $attendanceRegularization)
    {
        // Check if regularization already exists for this date and user
        $existingRegularization = AttendanceRegularization::where('user_id', $attendanceRegularization->user_id)
            ->where('date', $attendanceRegularization->date)
            ->exists();

        if ($existingRegularization) {
            throw new ApiException('Regularization entry already created for this date.');
        }

        Payrolls::checkRegularizations($attendanceRegularization);
        Payrolls::checkPayrolls($attendanceRegularization);

        return $attendanceRegularization;
    }

    public function updating(AttendanceRegularization $attendanceRegularization)
    {
        Payrolls::checkRegularizations($attendanceRegularization);
        Payrolls::checkPayrolls($attendanceRegularization);

        return $attendanceRegularization;
    }

    public function approveRegularization($id)
    {
        $loggedInUser = user();
        $regularization = AttendanceRegularization::findOrFail($this->getIdFromHash($id));
        $attendance = Attendance::where('date', $regularization->date)
            ->where('user_id', $regularization->user_id)
            ->first();

        $regularization->status = 'approved';
        $regularization->attendance_id = $attendance ? $attendance->id : null;
        $regularization->reviewed_by = $loggedInUser->id;
        $regularization->save();

        return ApiResponse::make([], 'Attendance regularization approved successfully.');
    }

    public function rejectRegularization($id)
    {
        $loggedInUser = user();
        $regularization = AttendanceRegularization::findOrFail($this->getIdFromHash($id));
        $attendance = Attendance::where('date', $regularization->date)
            ->where('user_id', $regularization->user_id)
            ->first();

        $regularization->status = 'rejected';
        $regularization->attendance_id = $attendance ? $attendance->id : null;
        $regularization->reviewed_by = $loggedInUser->id;
        $regularization->save();

        return ApiResponse::make([], 'Attendance regularization rejected successfully.');
    }
}
