<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;

class UserMonthlyShift extends Model
{
    protected $table = 't_users_monthly_shift';

    const CREATED_AT = 'created_at';
    const UPDATED_AT = 'updated_at';

    protected $fillable = [
        'company_id', 'project_id', 'start_at', 'end_at', 'user_id', 'remarks', 'schedules',
        'created_at', 'created_by', 'updated_at', 'updated_by'
    ];

    protected $appends = [
        'user_name', 'user_ktp_number'
    ];
    private $user_name = "";
    private $user_ktp_number = "";
    public function getUserNameAttribute() {
        return $this->user_name;
    }
    public function getUserKtpNumberAttribute() {
        return $this->user_ktp_number;
    }
    private function assignUserInfo($users)
    {
        foreach ($users as $user) {
            if ($user->id == $this->user_id) {
                $this->setUserInfo($user);
                break;
            }
        }
    }
    private function setUserInfo($user) 
    {
        $this->user_name = $user->name;
        $this->user_ktp_number = $user->ktp_number;
    }

    public static function deleteYYYYMM($yyyymm)
    {
        $rawWhere = DB::raw("to_char(start_at + (end_at - start_at) / 2, 'YYYYMM')");
        $res = UserMonthlyShift::where($rawWhere, $yyyymm)->delete();
        return $res;
    }

    public static function monthlyWithUserInfo($yyyymm) 
    {

        $rawWhere = DB::raw("to_char(start_at+INTERVAL '1 day', 'YYYYMM')");
        $userIds = UserMonthlyShift::where($rawWhere, $yyyymm)->select('user_id');

        $users = User::whereIn('id', $userIds)
            ->orderBy('id')
            ->select('id', 'name', 'ktp_number')
            ->get();

        $schedules = UserMonthlyShift::where($rawWhere, $yyyymm)->get();
        if ($schedules) {
            foreach($schedules as $schedule)
            {
                $schedule->assignUserInfo($users);
            }
        }
        
        return $schedules;        
    }
}