middleware('api')->except('create');
    }
    public function get(Request $request)
    {
        $tracking = new Tracking;
        // Order by
        $this->orderByRequest($tracking, $request);
        $tracking->orderBy('created_at', 'desc');
        // Filter
        $this->filterRequest(
            builder: $tracking,
            request: $request,
            filterKeys: [
                'created_at' => self::F_IN_DATETIME,
                'time_string' => self::F_TEXT,
                'name' => self::F_TEXT,
                'status' => self::F_TEXT
            ]
        );
        $this->searchRequest(
            builder: $tracking,
            value: $request->get('search'),
            fields: [
                'name',
                'time_string',
                'status'
            ]
        );
        $responseData = array_merge(
            $tracking->paginate($request->get('per_page'))->toArray(),
            ['status' => true]
        );
        // $users = Admin::where('permission', '!=', 'admin')->get();
        $users = Admin::where('permission', 'like', '%staff%')->get();
        $responseData['users'] = $users;
        return response()->json($responseData);
    }
    public function create(Request $request)
    {
        try {
            $validatedData = $request->validate([
                'name' => 'required',
                'time_string' => 'required',
                'status' => 'required',
            ]);
            $payload = $request->only(['name', 'time_string', 'status']);
            if ($request->has('created_at')) {
                $payload['created_at'] = Carbon::create($request->created_at)->setTimezone(env('TIME_ZONE'));
            } else {
                $payload['created_at'] = Carbon::create(new DateTime())->setTimezone(env('TIME_ZONE'));
            }
            $user = Admin::where('name', $payload['name'])->first();
            $date = Carbon::create(new DateTime())->setTimezone(env('TIME_ZONE'))->format('Y-m-d');
            if ($user) {
                $payload['user_id'] = $user->id;
                $latest = Tracking::where('name', $payload['name'])->whereDate('created_at', $date)->latest()->first();
                if ($latest) {
                    if ($payload['status'] == $this->CHECK_IN || $payload['status'] == $this->CHECK_OUT) {
                        if ($latest->status == $this->CHECK_IN) {
                            $payload['status'] = $this->CHECK_OUT;
                        }
                        if ($latest->status == $this->CHECK_OUT) {
                            $payload['status'] = $this->CHECK_IN;
                        }
                        $tracking = Tracking::create($payload);
                        $this->createOrUpdateRecordForCurrentMonth($payload['created_at']->month, $payload['created_at']->year);
                        return response()->json([
                            'data' => $tracking,
                            'check_status' => $payload['status'],
                            'status' => true
                        ]);
                    } else {
                        return response()->json([
                            'data' => "STATUS INVALID",
                            'status' => false
                        ]);
                    }
                } else {
                    $payload['status'] = $this->CHECK_IN;
                    $tracking = Tracking::create($payload);
                    $this->createOrUpdateRecordForCurrentMonth($payload['created_at']->month, $payload['created_at']->year);
                    return response()->json([
                        'data' => $tracking,
                        'check_status' => $this->CHECK_IN,
                        'status' => true
                    ]);
                }
            }
            return response()->json([
                'data' => "USER NOT EXIST",
                'status' => false
            ]);
        } catch (\Illuminate\Validation\ValidationException $e) {
            return response()->json([
                'data' => "IMPORT DATA FAIL",
                'status' => false
            ], 422);
        }
    }
    public function update(Request $request)
    {
        $id = $request->get('id');
        $tracking = Tracking::find($id);
        $payload = $request->all();
        if ($request->has('created_at')) {
            $payload['created_at'] = Carbon::create($request->created_at)->setTimezone(env('TIME_ZONE'));
        } else {
            $payload['created_at'] = Carbon::create(new DateTime())->setTimezone(env('TIME_ZONE'));
        }
        if ($tracking) {
            $tracking->update($payload);
            $this->createOrUpdateRecordForCurrentMonth($payload['created_at']->month, $payload['created_at']->year);
        }
        return response()->json([
            'data' => $tracking,
            'status' => true
        ]);
    }
    public function saveImage(Request $request)
    {
        $id = $request->get('id');
        $tracking = Tracking::find($id);
        $user = Admin::find($tracking->user_id);
        $this->sendCheckinLateMail($user, $tracking->created_at, $tracking->status);
        if ($request->hasFile('image')) {
            $file = $request->file('image');
            $filename = $request->file_name;
            $path = 'screenshot' . "/$filename";
            Storage::disk('public')->put(
                path: $path,
                contents: $file->get()
            );
            $tracking->image = $path;
            $tracking->save();
            $date = Carbon::create(new DateTime())->setTimezone(env('TIME_ZONE'));
            $this->createOrUpdateRecordForCurrentMonth($date->month, $date->year);
        }
        return response()->json([
            'data' => $tracking,
            'status' => true
        ]);
    }
    public function delete(Request $request)
    {
        $id = $request->get('id');
        Tracking::destroy($id);
        $date = Carbon::create(new DateTime())->setTimezone(env('TIME_ZONE'));
        $this->createOrUpdateRecordForCurrentMonth($date->month, $date->year);
        return response()->json([
            'status' => true
        ]);
    }
    // public function sendCheckinLateMail()
    private function sendCheckinLateMail($user, $time, $status)
    {
        // $status = $this->CHECK_IN;
        // $lastCheck =Tracking::find(1)->created_at;
        // $user = Admin::where('name', 'LE TAN LUAN')->first();
        if ($status === $this->CHECK_IN) {
            $morning_time = Carbon::createFromTimeString('07:30AM')->setTimezone(env('TIME_ZONE'));
            $morning_condition_time = Carbon::createFromTimeString('07:40AM')->setTimezone(env('TIME_ZONE'));
            $afternoon_time = Carbon::createFromTimeString('11:30AM')->setTimezone(env('TIME_ZONE'));
            $afternoon_condition_time = Carbon::createFromTimeString('01:10PM')->setTimezone(env('TIME_ZONE'));
            $admin_mails = Admin::where('permission', 'like', '%admin%')->pluck('email');
            if ($time->greaterThan($morning_condition_time) && $time->lessThan($afternoon_time)) {
                $period = 'morning';
                $minutes_late = $morning_time->diffInMinutes($time);
                $data = array(
                    "email_template" => "email.checkin_late_notification",
                    "email" => $user->email,
                    "name" => $user->name,
                    "admin_mails" => $admin_mails,
                    "message1" => "Your " . $period . " starts " . $minutes_late . " minutes late",
                    "message2" => "You checked in at [" . $time . "]",
                    "url" => env('ADMIN_URL') . "/tracking?search=&per_page=10&page=1&timezone=Asia%2FSaigon&name=" . $user->name . "&time_string=" . $time->format("Y-m-d H:i") . "&status=check+in",
                    "subject" => "[Management System] Late warning - " . $user->name
                );
                Mail::to($user->email)->cc($admin_mails)->send(new CheckinLateMail($data));
            }
            // if ($time->greaterThan($afternoon_condition_time))
            // {
            //     $period = 'afternoon';
            //     $minutes_late = $afternoon_time->diffInMinutes($time);
            //     $data = array(
            //         "email_template" => "email.checkin_late_notification",
            //         "email" => $user->email,
            //         "name" => $user->name,
            //         "message1" => "Your ". $period ." starts ". $minutes_late ." minutes late",
            //         "message2" => "You checked in at [" . $time ."]",
            //         "url" => env('ADMIN_URL')."/tracking?search=&per_page=10&page=1&timezone=Asia%2FSaigon&name=".$user->name."&time_string=".$time->format("Y-m-d H:i")."&status=check+in",
            //         "subject" => "[Management System] Late warning"
            //     );
            //     Mail::to($user->email)->cc($admin_mails)->send(new CheckinLateMail($data));
            // }
        }
    }
    public function getSummaryTracking(Request $request)
    {
        $request->validate([
            'userID' => 'required|exists:users,id',
            'fromDate' => 'nullable|date',
            'toDate' => 'nullable|date',
        ]);
        $userID = $request->input('userID');
        $startDate = $request->input('fromDate');
        $endDate = $request->input('toDate');
        $trackingData = Tracking::where('user_id', $userID)
            ->where('status', 'check in');
        if ($startDate && $endDate) {
            $trackingData->whereBetween(
                DB::raw("STR_TO_DATE(time_string, '%Y-%m-%d %H:%i:%s')"),
                [$startDate, $endDate . ' 23:59:59']
            );
        } elseif ($startDate) {
            $trackingData->where(
                DB::raw("STR_TO_DATE(time_string, '%Y-%m-%d %H:%i:%s')"),
                '>=',
                $startDate
            );
        } elseif ($endDate) {
            $trackingData->where(
                DB::raw("STR_TO_DATE(time_string, '%Y-%m-%d %H:%i:%s')"),
                '<=',
                $endDate . ' 23:59:59'
            );
        }
        $onTimeMorning = 0;
        $lateMorning = 0;
        $onTimeAfternoon = 0;
        $lateAfternoon = 0;
        $datesChecked = [];
        $trackingData->get()->groupBy(function ($record) {
            return Carbon::parse($record->time_string)->toDateString();
        })->each(function ($records, $date) use (&$onTimeMorning, &$lateMorning, &$onTimeAfternoon, &$lateAfternoon, &$datesChecked) {
            $morningCheck = $records->filter(function ($record) {
                return Carbon::parse($record->time_string)->hour < 12;
            })->sortBy('time_string')->first();
            $afternoonCheck = $records->filter(function ($record) {
                return Carbon::parse($record->time_string)->hour >= 12;
            })->sortBy('time_string')->first();
            $morningTime = Carbon::parse($date)->setTime(7, 40, 0);
            $afternoonTime = Carbon::parse($date)->setTime(13, 10, 0);
            if ($morningCheck) {
                $checkInTime = Carbon::parse($morningCheck->time_string);
                if ($checkInTime->lessThanOrEqualTo($morningTime)) {
                    $onTimeMorning++;
                } else {
                    $lateMorning++;
                }
            }
            if ($afternoonCheck) {
                $checkInTime = Carbon::parse($afternoonCheck->time_string);
                if ($checkInTime->lessThanOrEqualTo($afternoonTime)) {
                    $onTimeAfternoon++;
                } else {
                    $lateAfternoon++;
                }
            } else {
                // Default to on time if no afternoon check-in
                $onTimeAfternoon++;
            }
        });
        return AbstractController::ResultSuccess([
            'on_time_morning' => $onTimeMorning,
            'late_morning' => $lateMorning,
            'on_time_afternoon' => $onTimeAfternoon,
            'late_afternoon' => $lateAfternoon,
            'value' => $trackingData->get()
        ]);
    }
}