<?php

namespace App\Jobs;

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

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

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

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

        $hostel = Hostel::find($hostelId);

        $membersArr = [$userId];
        sort($membersArr);

        $conversation = Conversation::create([
            'name' => $hostel->name,
            'image' => '/frontend3/assets/img/placeholder.png',
            'members' => implode(',', $membersArr),
            'hostel_id' => $hostel->id,
            'user_id' => $userId,
            'is_find' => false
        ]);

        $membersArrSync = [];

        foreach ($membersArr as $member)
        {
            if($member == $userId) {
                $membersArrSync[$member] = [
                    'is_admin' => true
                ];
            } else {
                $membersArrSync[$member] = [
                    'is_admin' => false
                ];
            }
        }

        $conversation->users()->sync($membersArrSync);

        $message = Message::create([
            'content' => ' đã tạo cuộc hội thoại',
            'conversation_id' => $conversation->id,
            'type' => Message::TYPE_SYSTEM,
            'from' => $userId
        ]);

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


	    $pusher = \PusherService::getClient();

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

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

        foreach ($userConverIds as $userConverId) {

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

        }
    }
}
