<?php

namespace App\Jobs;

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

    /**
     * Create a new job instance.
     *
     * @return void
     */
    protected $message;
    protected $toUser;
    protected $fromUser;

    public function __construct($message, $toUser, $fromUser=null)
    {
        //
        $this->message = $message;
        $this->toUser = $toUser;
        $this->fromUser = $fromUser;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function onConnection($connection)
    {
        $this->connection = 'redis';
        return $this;
    }

    public function handle()
    {
        //
	    $pusher = \PusherService::getClient();

        $idbot = 7204;
        if(!empty($this->fromUser))
        {
        	$idbot = $this->fromUser;
        }
        $message = $this->message;
        $membersArr = [
            $idbot, $this->toUser
        ];

        sort($membersArr);
        $conversation = Conversation::query()->where('members', implode(',', $membersArr))
            ->first();

        if (!$conversation) {

            $conversation = Conversation::create([
                'name' => null,
                'image' => null,
                'members' => implode(',', $membersArr),
                'user_id' => $idbot

            ]);
        }

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


        $message = Message::create([
            'content' => $message,
            'conversation_id' => $conversation->id,
            'type' => Message::TYPE_TEXT,
            'from' => $idbot
        ]);

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

        $messageArr = $message->toArray();
        $content = $message->content;
        $userOnlineArr = [];

        if (isset($usersChannel['result'])) {
            if (isset($usersChannel['result']['users'])) {
                foreach ($usersChannel['result']['users'] as $item) {
                    $userIdOnline = $item['id'];
                    $userOnlineArr[] = $userIdOnline;
                }
            }
        }

        foreach ($membersArr as $userId) {


            $q = \DB::table('user_conversations')
                ->where('conversation_id', $conversation->id)
                ->where('user_id', $userId);

            if (in_array($userId, $userOnlineArr)) {
                $q->update([
                    'is_read_last_message' => 1
                ]);
            } else {
                $q->update([
                    'is_read_last_message' => 0
                ]);
            }

            if ($message->type == Message::TYPE_IMAGE || $message->type == Message::TYPE_SYSTEM) {
                if ($userId == $idbot) {
                    if ($message->type == Message::TYPE_IMAGE) {
                        $content = 'Bạn đã gửi một ảnh';
                    } else {
                        $content = 'Bạn ' . $content;
                    }
                } else {
                    $fromUser = $message->fromUser;
                    if ($fromUser) {
                        if ($message->type == Message::TYPE_IMAGE) {
                            $content = $fromUser->name_text . ' đã gửi một ảnh';
                        } else {
                            $content = $fromUser->name_text .' '. $content;
                        }
                    }
                }

            }

            $messageArr['content'] = $content;
            $pusher->trigger('chat-' . $userId, 'new-message', $messageArr);
            dispatch(new SendNotificationMessage($userId, $messageArr));
        }
    }
}
