<?php

namespace App\Traits;

use App\Helper\Cache\CurrentMonthTimekeeping;
use App\Models\Notes;
use Carbon\Carbon;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\DB;
use Modules\Admin\app\Models\Admin;
use Modules\Admin\app\Models\MonthlyTimekeeping;

trait AnalyzeData
{
    /**
     * Return a JSON response.
     *
     * @param  mixed  $data
     * @param  int  $status
     * @param  array  $headers
     * @param  int  $options
     * @return array $result
     */
    public function analyzeCurrentMonthTimeKeepingData($month, $year)
    {
        // dd((int)$month, (int)$year);
        $now = Carbon::create((int)$year, (int)$month);
        // $now = Carbon::create(2024, 5, 30); // Nếu muốn khởi tạo với một ngày cụ thể
        $daysInMonth = $now->daysInMonth;
        // Lấy ngày đầu tháng
        $startOfMonth = $now->startOfMonth()->toDateString();
        // Lấy ngày cuối tháng
        $endOfMonth = $now->endOfMonth()->endOfDay()->toDateTimeString();
        $admins = Admin::all();
        $history = DB::table('tracking')->select('*')->whereBetween('tracking.created_at', [$startOfMonth, $endOfMonth])->orderBy('tracking.created_at', 'asc')->get();
        $dataNotes = Notes::getNotesByMonthAndYear((int)$month, (int)$year);

        $history = collect($history);
        $result = [];
        foreach ($admins as $key => $admin) {
            $user_data = [];
            for ($i = 1; $i <= $daysInMonth; $i++) {
                // Tạo ngày cụ thể trong tháng
                $date = Carbon::create($now->year, $now->month, $i)->setTimezone(env('TIME_ZONE'))->format('Y-m-d');
                // Kiểm tra xem có mục nào trong $history có created_at trùng với $date
                $hasEntry = $history->filter(function ($entry) use ($date, $admin) {
                    // echo($hasEntry);
                    return Carbon::parse($entry->created_at)->setTimezone(env('TIME_ZONE'))->format('Y-m-d') === $date && $entry->user_id == $admin->id;
                });
                $hasNotes = $dataNotes->filter(function ($entry) use ($i, $admin) {
                    return $entry->n_user_id == $admin->id && $entry->n_day == $i;
                });
                // dd($date,$admin,$history,$daysInMonth);
                if (count($hasEntry) > 0) {
                    $values = array_values($hasEntry->toArray());
                    $last_checkin = null;
                    $total = 0;
                    foreach ($values as $value) {
                        $createdAt = Carbon::parse($value->created_at)->setTimezone(env('TIME_ZONE'));
                        if ($value->status == 'check out' && $last_checkin != null) {
                            $lastCheckInTime = Carbon::parse($last_checkin)->setTimezone(env('TIME_ZONE'));
                            // Tính thời gian làm việc bằng hiệu của thời gian check out và check in
                            $workingTime = $createdAt->diffInSeconds($lastCheckInTime);
                            $total += $workingTime;
                        }

                        if ($value->status == 'check in') {
                            $last_checkin = $createdAt;
                        }
                    }
                    $notes = [];
                    if (count($hasNotes) > 0) {
                        foreach ($hasNotes as $k_Note => $value_Note) {
                            $notes[$k_Note] = [
                                'id' => $value_Note->n_id,
                                'timeType' => $value_Note->n_time_type,
                                'timeTypeName' => $value_Note->time_type_name,
                                'reason' => $value_Note->n_reason,
                                'reasonName' => $value_Note->reason_name,
                                'note' => $value_Note->n_note
                            ];
                        }
                    }
                    $user_data[] = ['values' => array_values($hasEntry->toArray()), 'notes' => array_values($notes), 'total' => $total, 'day' => $i];
                } else {
                    if (count($hasNotes) > 0) {
                        $notes = [];
                        foreach ($hasNotes as $k_Note => $value_Note) {
                            $notes[$k_Note] = [
                                'id' => $value_Note->n_id,
                                'timeType' => $value_Note->n_time_type,
                                'timeTypeName' => $value_Note->time_type_name,
                                'reason' => $value_Note->n_reason,
                                'reasonName' => $value_Note->reason_name,
                                'note' => $value_Note->n_note
                            ];
                        }
                        $user_data[] = ['values' => [], 'notes' => array_values($notes), 'total' => 0, 'day' => $i];
                    }
                }
            }

            $result[] = ['user' => $admin, 'history' => $user_data];
        }
        return $result;
    }

    public function createOrUpdateRecordForCurrentMonth($month, $year)
    {
        $data = MonthlyTimekeeping::where('month', '=', $month)->where('year', '=', $year)->first();
        if ($data) {
            $result = $this->analyzeCurrentMonthTimeKeepingData($month, $year);
            $data->update(['data' => json_encode($result)]);
        } else {
            $result = $this->analyzeCurrentMonthTimeKeepingData($month, $year);
            MonthlyTimekeeping::create(['month' => $month, 'year' => $year, 'working_days' => Carbon::create((int)$year, (int)$month)->daysInMonth, 'data' => json_encode($result)]);
        }

        CurrentMonthTimekeeping::cleanCacheCurrentMonthTimekeeping();
        return;
    }
}
