<?php

namespace App\Jobs;

use App\Components\Functions;
use App\Models\Conversation;
use App\Models\Message;
use App\Models\RenterRoom;
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 AddRenterConversation implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    protected $roomId;
    protected $userId;
    protected $userCreate;

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

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        //
        $roomId = $this->roomId;
        $userId = $this->userId;
        $userCreate = $this->userCreate;
        $userCreateModel = User::find($userCreate);
        $user = User::find($userId);

	    $pusher = \PusherService::getClient();

        // add vao room
        $room = Room::find($roomId);
        if(!$room)
        {
        	return;
        }

        $hostel = $room->hostel;
        $isCreateNewConversationRoom = false;
        $isCreateNewConversationHostel = false;

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

        $ownerId = $hostel->owner_id;

        $userArr = \DB::table('staff_hostels')
            ->where('hostel_id', $hostel->id)
            ->pluck('user_id')
            ->toArray();

        $userArr[] = $hostel->owner_id;

        $renterRoom = RenterRoom::where('room_id', $room->id)->pluck('user_id')->toArray();

        $userArr = array_merge($userArr, array_unique($renterRoom));

        $membersRoom = User::whereIn('id', $userArr)
            ->get();

        $membersRoomArr = array_unique($membersRoom->pluck('id')->toArray());
        sort($membersRoomArr);

        if (!$conversationRoom) {
            $conversationRoom = Conversation::create([
                'name' => $room->name,
                'image' => '/frontend3/assets/img/placeholder.png',
                'members' => implode(',', $membersRoomArr),
                'hostel_id' => $room->hostel->id,
                'room_id' => $room->id,
                'user_id' => $userCreate
            ]);

            $isCreateNewConversationRoom = true;

        }

        $conversationRoom->users()->sync($membersRoomArr);

        if ($isCreateNewConversationRoom) {
            $messageRoom = Message::create([
                'content' => ' đã tạo cuộc hội thoại',
                'conversation_id' => $conversationRoom->id,
                'type' => Message::TYPE_SYSTEM,
                'from' => $userCreate
            ]);
        } else {
            $messageRoom = Message::create([
                'content' => ' đã thêm ' . $user->name_text . ' vào cuộc hội thoại',
                'conversation_id' => $conversationRoom->id,
                'type' => Message::TYPE_SYSTEM,
                'from' => $userCreate
            ]);
        }

        $conversationRoom->update([
            'last_message_id' => $messageRoom->id,
            'last_message_time' => Carbon::now()->toDateTimeString()
        ]);


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

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

        foreach ($userConverIds as $userConverId) {

            $messageRoomArr['user_from'] = [
                'id' => $userCreateModel->id,
                'name' => $userCreateModel->name_text,
                'phone' => $userCreateModel->phone,
                'image' => $userCreateModel->image

            ];

            $messageRoomArr = $messageRoom->toArray();
            if ($userConverId == $userCreate) {
                $messageRoomArr['content'] = 'Bạn ' . $messageRoomArr['content'];
            } else {
                $messageRoomArr['content'] = $userCreateModel->name_text . ' ' . $messageRoomArr['content'];
            }

            $messageRoomArr['conversation_last_message'] = $messageRoomArr['content'];
            $messageRoomArr['conversation_name'] = $conversationName;
            $messageRoomArr['conversation_image'] = $conversationImage;

            $pusher->trigger('chat-' . $userConverId, 'new-message', $messageRoomArr);

        }


//them nha
        $conversationHostel = Conversation::where('hostel_id', $hostel->id)->whereNull('room_id')->first();

        $ownerId = $hostel->owner_id;

        $userArr = \DB::table('staff_hostels')
            ->where('hostel_id', $hostel->id)
            ->pluck('user_id')
            ->toArray();

        $userArr[] = $hostel->owner_id;

        $renterHostel = RenterRoom::where('hostel_id', $hostel->id)->pluck('user_id')->toArray();

        $userArrHostel = array_merge($userArr, array_unique($renterHostel));

        $membersHostel = User::whereIn('id', $userArrHostel)
            ->get();

        $membersHostelArr = array_unique($membersHostel->pluck('id')->toArray());
        sort($membersHostelArr);

        if (!$conversationHostel) {
            $conversationHostel = Conversation::create([
                'name' => $hostel->name,
                'image' => '/frontend3/assets/img/placeholder.png',
                'members' => implode(',', $membersRoomArr),
                'hostel_id' => $hostel->id,
                'user_id' => $userCreate
            ]);

            $isCreateNewConversationHostel = true;

        }

        $conversationHostel->users()->sync($membersHostelArr);

        if ($isCreateNewConversationHostel) {
            $messageHostel = Message::create([
                'content' => ' đã tạo cuộc hội thoại',
                'conversation_id' => $conversationHostel->id,
                'type' => Message::TYPE_SYSTEM,
                'from' => $userCreate
            ]);
        } else {
            $messageHostel = Message::create([
                'content' => ' đã thêm ' . $user->name_text . ' vào cuộc hội thoại',
                'conversation_id' => $conversationHostel->id,
                'type' => Message::TYPE_SYSTEM,
                'from' => $userCreate
            ]);
        }

        $conversationHostel->update([
            'last_message_id' => $messageHostel->id,
            'last_message_time' => Carbon::now()->toDateTimeString()
        ]);

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

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

        foreach ($userConverIds as $userConverId) {

            $messageHostelArr['user_from'] = [
                'id' => $userCreateModel->id,
                'name' => $userCreateModel->name_text,
                'phone' => $userCreateModel->phone,
                'image' => $userCreateModel->image

            ];
            $messageHostelArr = $messageHostel->toArray();
            if ($userConverId == $userCreate) {
                $messageHostelArr['content'] = 'Bạn ' . $messageHostelArr['content'];
            } else {
                $messageHostelArr['content'] = $userCreateModel->name_text . ' ' . $messageHostelArr['content'];
            }

            $messageHostelArr['conversation_last_message'] = $messageHostelArr['content'];
            $messageHostelArr['conversation_name'] = $conversationName;
            $messageHostelArr['conversation_image'] = $conversationImage;

            $pusher->trigger('chat-' . $userConverId, 'new-message', $messageHostelArr);

        }


    }
}
