<?php

namespace App\Http\Controllers\Api\Self;

use App\Classes\Payrolls;
use App\Http\Controllers\ApiBaseController;
use Examyou\RestAPI\Exceptions\ApiException;
use App\Http\Requests\Api\Self\AttendanceRegularization\IndexRequest;
use App\Http\Requests\Api\Self\AttendanceRegularization\StoreRequest;
use App\Http\Requests\Api\Self\AttendanceRegularization\UpdateRequest;
use App\Http\Requests\Api\Self\AttendanceRegularization\DeleteRequest;
use App\Models\Attendance;
use App\Models\AttendanceRegularization;
use App\Models\Payroll;

class AttendanceRegularizationController extends ApiBaseController
{
    protected $model = AttendanceRegularization::class;

    protected $indexRequest = IndexRequest::class;
    protected $storeRequest = StoreRequest::class;
    protected $updateRequest = UpdateRequest::class;
    protected $deleteRequest = DeleteRequest::class;

    protected function modifyIndex($query)
    {
        $request = request();
        $loggedUser = user();

        $query = $query->where('user_id', $loggedUser->id);

        // Status filter
        if ($request->has('status') && $request->status !== '' && $request->status !== 'all') {
            $query->where('attendance_regularizations.status', $request->status);
        }

        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)
    {
        $loggedUser = user();

        // Set user_id first before validation checks
        $attendanceRegularization->user_id = $loggedUser->id;

        // 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);
        $attendance = Attendance::where('user_id', $loggedUser->id)
            ->whereDate('date', $attendanceRegularization->date)
            ->where(function ($q) {
                $q->whereNotNull('clock_in_time')
                    ->orWhereNotNull('clock_out_time');
            })
            ->first();

        // Set attendance_id only if attendance record found
        $attendanceRegularization->attendance_id = $attendance ? $attendance->id : null;
        // Set default status
        $attendanceRegularization->status = 'pending';

        return $attendanceRegularization;
    }

    public function stored(AttendanceRegularization $attendanceRegularization)
    {

        return $attendanceRegularization;
    }

    public function updating(AttendanceRegularization $attendanceRegularization)
    {
        $loggedUser = user();

        // Set user_id first before validation checks
        $attendanceRegularization->user_id = $loggedUser->id;

        Payrolls::checkRegularizations($attendanceRegularization);
        Payrolls::checkPayrolls($attendanceRegularization);

        return $attendanceRegularization;
    }

    public function destroying(AttendanceRegularization $attendanceRegularization)
    {
        $loggedUser = user();

        // Cannot delete approved or rejected attendanceRegularization
        if ($attendanceRegularization->status == 'approved' || $attendanceRegularization->status == 'rejected') {
            throw new ApiException("Not have valid permission");
        }

        // Cannot delete other user attendanceRegularization if not have permission
        if ($attendanceRegularization->user_id != $loggedUser->id) {
            throw new ApiException("Not have valid permission");
        }

        return $attendanceRegularization;
    }
}
