<?php

namespace App\Http\Controllers\Api;

use App\Classes\CommonHrm;
use App\Http\Controllers\ApiBaseController;
use App\Http\Requests\Api\ShiftAssignment\IndexRequest;
use App\Http\Requests\Api\ShiftAssignment\StoreRequest;
use App\Http\Requests\Api\ShiftAssignment\UpdateRequest;
use App\Http\Requests\Api\ShiftAssignment\DeleteRequest;
use App\Http\Requests\Api\ShiftAssignment\UserShiftAssignmentRequest;
use App\Models\ShiftAssignment;
use Carbon\Carbon;
use Examyou\RestAPI\ApiResponse;

class ShiftAssignmentController extends ApiBaseController
{
    protected $model = ShiftAssignment::class;

    protected $indexRequest = IndexRequest::class;
    protected $storeRequest = StoreRequest::class;
    protected $updateRequest = UpdateRequest::class;
    protected $deleteRequest = DeleteRequest::class;

    public function modifyIndex($query)
    {
        $request = request();

        if ($request->has('date') && $request->date != '') {
            $attendanceDate = explode(',', $request->date);
            $date = $attendanceDate[0];
            $query = $query->where('shift_assignments.date', '=', [$date]);
        }

         if ($request->has('user_id') && $request->user_id != '') {

             $query = $query->where('shift_assignments.user_id', $this->getIdFromHash($request->user_id));
        }

        // if ($loggedUser->ability('admin', 'warnings_view')) {
        //     $query = $this->applyVisibility($query, 'warnings');

        //     if ($request->has('user_id')) {
        //         $query = $query->where('warnings.user_id', $this->getIdFromHash($request->user_id));
        //     }
        // } else {
        //     $query = $query->where('warnings.user_id', $loggedUser->id);
        // }

        return $query;
    }

    public function storing($shiftAssignment)
    {
        $request = request();
        $actualDateOut = Carbon::parse($request->date)->format('Y-m-d');
        $shiftAssignment->date = $actualDateOut;
        return $shiftAssignment;
    }


    public function updating($shiftAssignment)
    {
        $request = request();
        $actualDateOut = Carbon::parse($request->date)->format('Y-m-d');
        $shiftAssignment->date = $actualDateOut;
        return $shiftAssignment;
    }

    public function assigneShiftsToUsers(UserShiftAssignmentRequest $request)
    {
        $company = company();
        $userIds = $request->user_ids ?? [];
        $shiftId = $request->shift_id ? $this->getIdFromHash($request->shift_id) : null;
        $overwrite = $request->assignedShiftOverwrite;
        $markBy = $request->assign_shifts_by;

        $dates = [];

        if ($markBy === 'month' && $request->shift_assignment_month) {
            $month = (int)substr($request->shift_assignment_month, 5, 2);
            $year = (int)substr($request->shift_assignment_month, 0, 4);

            $startDate = Carbon::createFromDate($year, $month, 1);
            $endDate = $startDate->copy()->endOfMonth();

            while ($startDate->lte($endDate)) {
                $dates[] = $startDate->format('Y-m-d');
                $startDate->addDay();
            }
        } elseif ($markBy === 'date' && is_array($request->date) && count($request->date) === 2) {
            $startDate = Carbon::parse($request->date[0])->startOfDay();
            $endDate = Carbon::parse($request->date[1])->startOfDay();

            while ($startDate->lte($endDate)) {
                $dates[] = $startDate->format('Y-m-d');
                $startDate->addDay();
            }
        }

        $allShiftAssignedData = [];

        foreach ($userIds as $encodedUserId) {
            $userId = $this->getIdFromHash($encodedUserId);

            foreach ($dates as $date) {
                $existing = ShiftAssignment::where('user_id', $userId)
                    ->whereDate('date', $date)
                    ->first();

                if ($existing && !$overwrite) {
                    continue; // Skip if ShiftAssignment already exists and not overwriting
                }

                if (!$existing) {
                    $existing = new ShiftAssignment();
                }



                $existing->company_id = $company->id;
                $existing->user_id = $userId;
                $existing->date = $date;
                $existing->clock_in_time = $request->clock_in_time;
                $existing->clock_out_time = $request->clock_out_time;
                $existing->name = $request->name;
                $existing->short_name = $request->short_name;
                $existing->shift_id = $shiftId;
                $existing->remark = $request->remark;
                $existing->save();

                $allShiftAssignedData[] = $existing;
            }
        }

        return ApiResponse::make('Shift assigned to users successfully.', ['data' => $allShiftAssignedData]);
    }


    public function assignedSummary()
    {
        $detail = CommonHrm::shiftAssignmentDetail();

        return ApiResponse::make('Data fetched', [
            'columns' => $detail['columns'],
            'dateRange' => $detail['dateRange'],
            'data' => $detail['data'],
            'meta'  => [
                'paging' => [
                    'total' => $detail['totalRecords']
                ]
            ]
        ]);
    }
}
