<?php

namespace App\Jobs;

use App\Components\Functions;
use App\Models\Conversation;
use App\Models\Message;
use App\Models\Room;
use App\User;
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;
use Pusher\Pusher;

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


    protected $userId;
    protected $roomId;
    protected $pusher;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function onConnection($connection)
    {
        $this->connection = 'redis';
        return $this;
    }

    public function onQueue($connection)
    {
        $this->queue = 'low';
        return $this;
    }

    public function __construct($userId, $roomId)
    {
        //
        $this->userId = $userId;
        $this->roomId = $roomId;

	    $this->pusher = \PusherService::getClient();
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        //
        $roomId = $this->roomId;
        $userId = $this->userId;

        $room = Room::find($roomId);

        if (!$room) {
            return;
        }

        dispatch(new RemoveUserConversationV2($userId, null, $roomId));


        $conversationRoom = Conversation::where('room_id', $roomId)->first();

        if ($conversationRoom) {
            $userCreate = User::find($conversationRoom->user_id);
            if ($userCreate) {
                $this->removeUserConversation($conversationRoom, $userId, $userCreate);
            }
        }

        $hostelId = $room->hostel_id;
        dispatch(new RemoveUserConversationV2($userId, $hostelId, null));
        $conversationHostel = Conversation::where('hostel_id', $hostelId)->whereNull('room_id')->first();

        if ($conversationHostel) {
            $userCreate = User::find($conversationHostel->user_id);
            if ($userCreate) {
                $this->removeUserConversation($conversationHostel, $userId, $userCreate);
            }
        }
    }

    public function removeUserConversation($conversation, $userId, $userCreate)
    {

        if ($conversation) {
            $nameArr = [];
            $conversationId = $conversation->id;

            $user = User::withTrashed()->find($userId);
            if ($user) {
                $nameArr[] = $user->name_text;
            }

            \DB::table('user_conversations')
                ->where('user_id', $userId)
                ->where('conversation_id', $conversationId)
                ->delete();


            $userConverIds = \DB::table('user_conversations')
                ->where('conversation_id', $conversationId)
                ->pluck('user_id')
                ->toArray();

            sort($userConverIds);

            $message = Message::create([
                'content' => ' đã xóa ' . implode(',', $nameArr) . ' khỏi cuộc hội thoại',
                'conversation_id' => $conversation->id,
                'type' => Message::TYPE_SYSTEM,
                'from' => $userCreate->id
            ]);

            $conversation->members = implode(',', $userConverIds);
            $conversation->last_message_id = $message->id;
            $conversation->last_message_time = Carbon::now()->toDateTimeString();
            $conversation->save();

            $conversationLastMessage = $conversation->last_message;
            $info = Functions::getNameImageConversation($conversation->id, $conversation->image, $conversation->name,
                $conversation->hostel_id,
                $userCreate);
            $conversationName = $info['name'];
            $conversationImage = $info['image'];

            foreach ($userConverIds as $userConverId) {

                $messageArr = $message->toArray();
                if ($userConverId == $userCreate->id) {
                    $messageArr['content'] = 'Bạn ' . $messageArr['content'];
                } else {
                    $messageArr['content'] = $userCreate->name_text .' '. $messageArr['content'];
                }
                $messageArr['conversation_last_message'] = $messageArr['content'];
                $messageArr['conversation_name'] = $conversationName;
                $messageArr['conversation_image'] = $conversationImage;
                $this->pusher->trigger('chat-' . $userConverId, 'new-message', $messageArr);

            }
        }
    }
}
