<?php

namespace App\Jobs;

use App\Models\LeaveDays;
use App\Models\Notes;
use App\Models\User;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;

class InitializeLeaveDays implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $year;

    /**
     * Create a new job instance.
     */
    public function __construct($year = null)
    {
        // Nếu không có năm được truyền vào, sử dụng năm hiện tại
        $this->year = $year ?? Carbon::now()->year;
    }

    /**
     * Execute the job.
     */
    public function handle(): void
    {
        $users = User::get();
        $ld_day = 12;
        foreach ($users as $user) {
            // Kiểm tra xem dữ liệu của user này đã tồn tại cho năm hiện tại chưa
            $existingData = LeaveDays::where('ld_user_id', $user->id)
                ->where('ld_year', $this->year)
                ->first();

            if ($existingData) {
                // Nếu dữ liệu đã tồn tại, bỏ qua user này
                continue;
            }

            // Kiểm tra dữ liệu của user này trong năm trước
            $previousYearData = LeaveDays::where('ld_user_id', $user->id)
                ->where('ld_year', $this->year - 1)
                ->first();

            $ld_date_additional = 0;
            $ld_note = '';

            if ($previousYearData) {
                $ld_date_additional = $previousYearData->ld_day + $previousYearData->ld_date_additional;
                $totalLeaveDaysByMonth = Notes::join('categories', function ($join) {
                    $join->on('notes.n_time_type', '=', 'categories.c_code')
                        ->where('categories.c_type', 'TIME_TYPE');
                })
                    ->select(
                        DB::raw('notes.n_user_id as n_user_id'),
                        DB::raw('notes.n_year as year'),
                        DB::raw('SUM(categories.c_value) as leave_days')
                    )
                    ->where('notes.n_year', $this->year - 1)
                    ->where('notes.n_user_id', $user->id)
                    ->where('notes.n_reason', 'ONLEAVE')
                    ->groupBy(DB::raw('notes.n_year'))
                    ->first();
                if ($totalLeaveDaysByMonth) {
                    $ld_date_additional = $ld_date_additional - $totalLeaveDaysByMonth->leave_days;
                    if ($ld_date_additional < 0) {
                        $ld_date_additional = 0;
                    }
                }
                $ld_note = 'Cộng dồn ngày phép năm cũ';
            }

            // Tạo dữ liệu cho năm hiện tại
            LeaveDays::insert([
                'ld_user_id' => $user->id,
                'ld_day' => $ld_day,
                'ld_year' => $this->year,
                'ld_date_additional' => $ld_date_additional,
                'ld_note' => $ld_note,
                'created_at' => now(),
                'updated_at' => now(),
            ]);
        }
    }
}
