<?php

namespace App\Jobs;

use App\Components\Functions;
use App\Models\Notification;
use Carbon\Carbon;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;

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

    /**
     * Create a new job instance.
     *
     * @return void
     */
    protected $room;

    public function __construct($room)
    {
        //
        $this->room = $room;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        //
        $room = $this->room;
        $hostel = $room->hostel;
        if (!$hostel) {
            return;
        }

        $owner = $hostel->owner;

        if (!$owner) {
            return;
        }

        if ($room->date_available == null) {
            return;
        }

        $dateAvailable = Carbon::createFromFormat('Y-m-d', $room->date_available)->format('d/m/Y');

        $delayDate = $owner->remind_empty_room_interval;

        $isEmpty = Functions::ifEmptyRoom($room);

        if ($isEmpty > 0) {
            return;
        }
        $payload = null;
        $content = 'Phòng ' . $room->name . ' sẽ trống vào ngày ' . $dateAvailable . '. Hãy lên kế hoạch của bạn cho phòng này';
        if ($isEmpty == 0) {
            $content = 'Phòng ' . $room->name . ' đang trống. Hãy lên kế hoạch của bạn cho phòng này';
        }

        $payload = json_encode([
            'id' => $room->id,
            'type' => config('constants.ROOM')
        ]);

        Notification::create([
            'to_user' => $owner->id,
            'title' => 'Thông báo từ itro.vn',
            'user_id' => $owner->id,
            'content' => $content,
            'payload' => $payload,
        ]);

        if ($delayDate > 0) {
            $remindJob = (new RemindEmptyRoom($room))->delay(Carbon::now()->addDay($delayDate));
            dispatch($remindJob);
        }

    }
}
