<?php

namespace App\Http\Controllers\Frontend;

use App\Components\Functions;
use App\Jobs\SendNotificationMessage;
use App\Models\Conversation;
use App\Models\Hostel;
use App\Models\Message;
use App\Models\Notification;
use App\Models\Renter;
use App\Models\RenterRoom;
use App\Models\Room;
use App\User;
use Carbon\Carbon;
use Google\Cloud\Storage\StorageClient;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Firebase\FirebaseLib;
use Illuminate\Support\Str;
use Pusher\Pusher;

class ChatController extends Controller
{
    //
    protected $firebase;
    protected $pusher;

    public function __construct()
    {
        // $this->firebase = new FirebaseLib(env('FIREBASE_DATABASE_URL'), env('FIREBASE_SECRET_KEY'));.

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

    public function pushImage(Request $request)
    {
        $fromID = auth('backend')->user()->id;

        $to = $request->input('to');
        $image = $request->file('image');
        $location = $request->input('location');
        $content = null;
        $firebaseUrl = null;


        if (!empty($image)) {
            $imageUrl = Functions::uploadFile($image);

            $projectId = 'itro-2017';
            $storage = new StorageClient([
                'projectId' => $projectId,
                'keyFilePath' => storage_path('account.json')
            ]);

            $bucket = $storage->bucket('itro-2017.appspot.com');
            $name = $bucket->upload(fopen(public_path('files/' . $imageUrl), 'r'));
            $firebaseUrl = 'https://firebasestorage.googleapis.com/v0/b/itro-2017.appspot.com/o/' . $name->name() . '?alt=media';

        }
        $message = [
            'content' => $firebaseUrl,
            'fromID' => (string)$fromID,
            'isRead' => false,
            'timestamp' => time(),
            'toID' => (string)$to,
            'type' => 'photo',
        ];

        $messageImage = $message;
        $messageImage['content'] = 'Đã gửi một ảnh';

        if (!empty($location)) {

            $this->firebase->push('/conversations/' . $location . '/messages/', $message);
            $this->firebase->update('/users/' . $fromID . '/conversations/' . $to . '/last_message', $messageImage);

        } else {
            $res = $this->firebase->push('/conversations/', [
                'messages' => []
            ]);

            $res = json_decode($res, true);

            $location = $res['name'];

            $this->firebase->push('/conversations/' . $res['name'] . '/messages/', $message);
            $this->firebase->set('/users/' . $fromID . '/conversations/' . $to, ['location' => $location]);
            $this->firebase->set('/users/' . $fromID . '/conversations/' . $to . '/last_message', $messageImage);
        }

        $payload = json_encode([
            'id' => auth('backend')->user()->id,
            'type' => config('constants.MESSAGE')
        ]);

        $content = auth('backend')->user()->name . ' đã gửi 1 ảnh cho bạn';

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

        return response([
            'status' => 1,
            'message' => 'Thành công',
            'location' => $location,
            'url' => $firebaseUrl
        ]);
    }

    public function sendMessage(Request $request)
    {
        $content = $request->input('content');
        $conversationId = $request->input('conversation_id');
        $newConversation = $request->input('new_conversation');
        $image = $request->file('image');
        $userIds = $request->input('user_ids');
        $images = $request->file('images');

        $type = Message::TYPE_TEXT;

        if (!empty($image) && $image->isValid()) {
            $content = '/files/' . Functions::uploadImage($image);
            $type = Message::TYPE_IMAGE;
        }

        $userIds = collect($userIds)->pluck('id')->toArray();
        $userIds[] = auth('backend')->user()->id;
        if ($newConversation == 1) {
            $conversationId = $this->createConversation($userIds);
        }


        $message = Message::create([
            'content' => $content,
            'conversation_id' => $conversationId,
            'type' => $type,
            'from' => auth('backend')->user()->id
        ]);

        $conversation = Conversation::find($conversationId);

        if ($conversation) {
            $conversation->last_message = $content;
            $conversation->last_message_id = $message->id;
            $conversation->last_message_from = auth('backend')->user()->id;
            $conversation->last_message_time = Carbon::now()->toDateTimeString();
            $conversation->save();
        }

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

        $userIds = array_unique($userIds);


        $message->user_from = [
            'id' => auth('backend')->user()->id,
            'name' => auth('backend')->user()->name_text,
            'phone' => auth('backend')->user()->phone,
            'image' => auth('backend')->user()->image
        ];

        $messageArr = $message->toArray();
        $content = $message->content;

        $channelName = 'presence-read-conversation-' . $conversationId;
        $usersChannel = $this->pusher->get('/channels/' . $channelName . '/users');
        $userOnlineArr = [];
        if (isset($usersChannel['result'])) {
            if (isset($usersChannel['result']['users'])) {
                foreach ($usersChannel['result']['users'] as $item) {
                    $userIdOnline = $item['id'];
                    $userOnlineArr[] = $userIdOnline;
                }
            }
        }

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

        foreach ($userIds as $userId) {

            $q = \DB::table('user_conversations')
                ->where('conversation_id', $conversationId)
                ->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 == auth('backend')->user()->id) {
                    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['conversation_last_message'] = $conversationLastMessage;
            $messageArr['conversation_name'] = $conversationName;
            $messageArr['conversation_image'] = $conversationImage;
            $this->pusher->trigger('chat-' . $userId, 'new-message', $messageArr);

            dispatch(new SendNotificationMessage($userId, $messageArr));
        }
        return response([
            'status' => 1,
            'data' => $message
        ]);
    }

    public function setAdminConversation(Request $request)
    {
        $conversationId = $request->input('conversation_id');
        $conversation = Conversation::find($conversationId);
        if (!$conversation) {
            return response([
                'status' => 0,
                'message' => 'Dữ liệu không hợp lệ'
            ]);
        }

        $userId = $request->input('user_id');

        $cnt = \DB::table('user_conversations')
            ->where('conversation_id', $conversationId)
            ->where('user_id', $userId)
            ->count();
        if ($cnt == 0) {
            return response([
                'status' => 0,
                'message' => 'Dữ liệu không hợp lệ'
            ]);
        }

        \DB::table('user_conversations')
            ->where('conversation_id', $conversationId)
            ->where('user_id', $userId)
            ->update([
                'is_admin' => 1
            ]);

        return response([
            'status' => 1,
            'message' => 'Thành công'
        ]);
    }

    public function removeAdminConversation(Request $request)
    {
        $conversationId = $request->input('conversation_id');
        $conversation = Conversation::find($conversationId);
        if (!$conversation) {
            return response([
                'status' => 0,
                'message' => 'Dữ liệu không hợp lệ'
            ]);
        }

        $userId = $request->input('user_id');

        $cnt = \DB::table('user_conversations')
            ->where('conversation_id', $conversationId)
            ->where('user_id', $userId)
            ->count();
        if ($cnt == 0) {
            return response([
                'status' => 0,
                'message' => 'Dữ liệu không hợp lệ'
            ]);
        }

        $numberAdmin = \DB::table('user_conversations')
            ->where('conversation_id', $conversationId)
            ->where('is_admin', 1)
            ->count();

        if ($numberAdmin == 1) {
            return response([
                'status' => 0,
                'message' => 'Không thể xóa admin cuối cùng'
            ]);
        }

        \DB::table('user_conversations')
            ->where('conversation_id', $conversationId)
            ->where('user_id', $userId)
            ->update([
                'is_admin' => 0
            ]);

        return response([
            'status' => 1,
            'message' => 'Thành công'
        ]);
    }

    public function updateConversation(Request $request)
    {
        $conversationId = $request->input('conversation_id');
        $name = $request->input('name', '');
        $image = $request->file('image');

        $conversation = Conversation::find($conversationId);

        $content = null;
        if (!$conversation) {
            return response([
                'status' => 0,
                'message' => 'Dữ liệu không hợp lệ'
            ]);
        }

        if (empty($name) && empty($image)) {
            return response([
                'status' => 0,
                'message' => 'Dữ liệu không hợp lệ'
            ]);
        }

        if (!empty($name)) {
            $content = ' đã đổi tên nhóm thành ' . $name;
            $conversation->name = $name;
        }

        if (!empty($image) && $image->isValid()) {
            $image = Functions::uploadImage($image);
            $conversation->image = $image;
            $content = ' đã cập nhật ảnh đại diện nhóm';
        }

        $message = Message::create([
            'content' => $content,
            'conversation_id' => $conversation->id,
            'type' => Message::TYPE_SYSTEM,
            'from' => auth('backend')->user()->id
        ]);

        $conversation->save();

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

        $conversationLastMessage = 'Thông tin nhóm đã được thay đổi';
        $info = Functions::getNameImageConversation($conversation->id, $conversation->image, $conversation->name,
            $conversation->hostel_id, auth('backend')->user()->id);
        $conversationName = $info['name'];
        $conversationImage = $info['image'];

        foreach ($userIds as $userId) {

            $messageArr = $message->toArray();
            if ($userId == auth('backend')->user()->id) {
                $messageArr['content'] = 'Bạn ' . $messageArr['content'];
            } else {
                $messageArr['content'] = auth('backend')->user()->name_text . ' '.$messageArr['content'];
            }

            $messageArr['conversation_last_message'] = $conversationLastMessage;
            $messageArr['conversation_name'] = $conversationName;
            $messageArr['conversation_image'] = $conversationImage;

            $this->pusher->trigger('chat-' . $userId, 'new-message', $messageArr);

        }

        return response([
            'status' => 1,
            'message' => 'Thành công',
            'image' => $image,
            'conversation_id' => $conversationId,
            'name' => $name
        ]);

    }

    public function leaveConversation(Request $request)
    {
        $conversationId = $request->input('conversation_id');
        $userId = auth('backend')->user()->id;

        $conversation = Conversation::find($conversationId);


        if (!$conversation) {
            return response([
                'status' => 0,
                'message' => 'Dữ liệu không hợp lệ'
            ]);
        }

        try {
            \DB::beginTransaction();

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

            $cnt = \DB::table('user_conversations')
                ->where('conversation_id', $conversationId)
                ->count();

            $isGroup = false;

            if ($cnt > 2) {
                $isGroup = true;
            } else if ($cnt == 2) {
                if (!empty($conversation->hostel_id)) {
                    $isGroup = true;
                }
            }

            if (!$isGroup) {
                if ($cnt <= 2) {
                    return response([
                        'status' => 0,
                        'message' => 'Dữ liệu không hợp lệ'
                    ]);
                }
            }

            if ($check > 0) {

                \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);
            $conversation->members = implode(',', $userConverIds);
            $conversation->save();

            $message = Message::create([
                'content' => ' đã rời cuộc hội thoại',
                'conversation_id' => $conversation->id,
                'type' => Message::TYPE_SYSTEM,
                'from' => auth('backend')->user()->id
            ]);

            $conversationLastMessage = auth('backend')->user()->name_text . ' đã rời cuộc hội thoại';
            $info = Functions::getNameImageConversation($conversation->id, $conversation->image, $conversation->name,
                $conversation->hostel_id, auth('backend')->user()->id);
            $conversationName = $info['name'];
            $conversationImage = $info['image'];

            foreach ($userConverIds as $userConverId) {

                $messageArr = $message->toArray();
                if ($userConverId == auth('backend')->user()->id) {
                    $messageArr['content'] = 'Bạn ' . $messageArr['content'];
                } else {
                    $messageArr['content'] = auth('backend')->user()->name_text .' '. $messageArr['content'];
                }

                $messageArr['conversation_last_message'] = $conversationLastMessage;
                $messageArr['conversation_name'] = $conversationName;
                $messageArr['conversation_image'] = $conversationImage;

                $this->pusher->trigger('chat-' . $userId, 'new-message', $messageArr);

            }

            \DB::commit();
        } catch (\Exception $exception) {
            \DB::rollBack();

            return response([
                'status' => 0,
                'message' => 'Có lỗi xảy ra vui lòng thử lại sau'
            ]);
        }

        return response([
            'status' => 1,
            'message' => 'Thành công'
        ]);
    }

    public function removeUserToConversation(Request $request)
    {
        $conversationId = $request->input('conversation_id');
        $userIds = $request->input('user_ids');

        $conversation = Conversation::find($conversationId);

        if (!$conversation) {
            return response([
                'status' => 0,
                'message' => 'Dữ liệu không hợp lệ'
            ]);
        }

        if (in_array(auth('backend')->user()->id, $userIds)) {
            return response([
                'status' => 0,
                'message' => 'Bạn không thể xóa chính mình khỏi cuộc hội thoại'
            ]);
        }

        if (empty($userIds)) {
            return response([
                'status' => 0,
                'message' => 'Dữ liệu không hợp lệ'
            ]);
        }

        if (!is_array($userIds)) {
            return response([
                'status' => 0,
                'message' => 'Dữ liệu không hợp lệ'
            ]);
        }

        $cnt = \DB::table('user_conversations')
            ->where('conversation_id', $conversationId)
            ->count();

        if ($cnt <= 2) {
            return response([
                'status' => 0,
                'message' => 'Dữ liệu không hợp lệ'
            ]);
        }

        $userIds = array_unique($userIds);
        $nameArr = [];
        try {
            \DB::beginTransaction();
            foreach ($userIds as $userId) {
                $check = \DB::table('user_conversations')
                    ->where('user_id', $userId)
                    ->where('conversation_id', $conversationId)
                    ->count();

                if ($check > 0) {

                    $user = User::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);
            $conversation->members = implode(',', $userConverIds);
            $conversation->save();

            $conversationLastMessage = implode(',', $nameArr) . ' được xóa khỏi cuộc hội thoại';
            $info = Functions::getNameImageConversation($conversation->id, $conversation->image, $conversation->name,
                $conversation->hostel_id, auth('backend')->user()->id);
            $conversationName = $info['name'];
            $conversationImage = $info['image'];

            $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' => auth('backend')->user()->id
            ]);

            foreach ($userConverIds as $userConverId) {

                $messageArr = $message->toArray();
                if ($userConverId == auth('backend')->user()->id) {
                    $messageArr['content'] = 'Bạn ' . $messageArr['content'];
                } else {
                    $messageArr['content'] = auth('backend')->user()->name_text .' '. $messageArr['content'];
                }

                $messageArr['conversation_last_message'] = $conversationLastMessage;
                $messageArr['conversation_name'] = $conversationName;
                $messageArr['conversation_image'] = $conversationImage;

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

            }

            \DB::commit();
        } catch (\Exception $exception) {
            \DB::rollBack();

            return response([
                'status' => 0,
                'message' => 'Có lỗi xảy ra vui lòng thử lại sau'
            ]);
        }

        return response([
            'status' => 1,
            'message' => 'Thành công'
        ]);

    }


    public function getContacts(Request $request)
    {
        $name = $request->input('name');

        $retValRenter = [];
        $retValStaff = [];
        $contactsStaffs = [];
        $hostels = [];

        if (auth('backend')->user()->type == User::OWNER) {

            $hostels = Hostel::where('owner_id', auth('backend')->user()->id)->pluck('id')->toArray();

            $contactsStaffs = User::where('staff_owner_id', auth('backend')->user()->id);

            if (!empty($name)) {
                $contactsStaffs = $contactsStaffs->where(function ($q) use ($name) {
                    $q->orWhere('name', 'LIKE', '%' . $name . '%');
                    $q->orWhere('first_name', 'LIKE', '%' . $name . '%');
                    $q->orWhere('last_name', 'LIKE', '%' . $name . '%');
                });
            }

            $contactsStaffs = $contactsStaffs->get();
        } else if (auth('backend')->user()->type == User::STAFF) {

            $ownerId = auth('backend')->user()->staff_owner_id;

            $hostels = \DB::table('staff_hostels')
                ->where('user_id', auth('backend')->user()->id)
                ->pluck('hostel_id')
                ->toArray();

            $contactsStaffs = User::where(function ($q) use ($ownerId) {
                $q->where('staff_owner_id', $ownerId);
                $q->where('id', '<>', auth('backend')->user()->id);
            })
                ->orWhere('id', $ownerId);

            if (!empty($name)) {
                $contactsStaffs = $contactsStaffs->where(function ($q) use ($name) {
                    $q->orWhere('name', 'LIKE', '%' . $name . '%');
                    $q->orWhere('first_name', 'LIKE', '%' . $name . '%');
                    $q->orWhere('last_name', 'LIKE', '%' . $name . '%');
                });
            }

            $contactsStaffs = $contactsStaffs->get();

        } else if (auth('backend')->user()->type == User::RENTER) {
            $currentRent = RenterRoom::where('user_id', auth('backend')->user()->id)->first();

            if ($currentRent) {
                $hostel = $currentRent->hostel;
                if ($hostel) {
                    $ownerId = $hostel->owner_id;

                    $owner = User::find($ownerId);

                    if ($owner) {

                        $hostels = Hostel::where('id', $hostel->id)->pluck('id')->toArray();
                    } else {
                        $hostels = [];
                    }

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

                    $contactsStaffs = User::whereIn('id', $staffHostel)
                        ->orWhere('id', $ownerId);

                    if (!empty($name)) {
                        $contactsStaffs = $contactsStaffs->where(function ($q) use ($name) {
                            $q->orWhere('name', 'LIKE', '%' . $name . '%');
                            $q->orWhere('first_name', 'LIKE', '%' . $name . '%');
                            $q->orWhere('last_name', 'LIKE', '%' . $name . '%');
                        });
                    }

                    $contactsStaffs = $contactsStaffs->get();
                }
            }
        }
        $contactsRenters = User::select(\DB::raw('users.*, renter_rooms.room_id, renter_rooms.hostel_id'))
            ->join('renter_rooms', 'users.id', '=', 'renter_rooms.user_id')
            ->join('rooms', 'rooms.id', '=', 'renter_rooms.room_id')
            ->whereIn('renter_rooms.hostel_id', $hostels)
            ->where('users.id', '<>', auth('backend')->user()->id)
            ->orderBy('rooms.name');

        if (!empty($name)) {
            $contactsRenters = $contactsRenters->where(function ($q) use ($name) {
                $q->orWhere('users.name', 'LIKE', '%' . $name . '%');
                $q->orWhere('users.first_name', 'LIKE', '%' . $name . '%');
                $q->orWhere('users.last_name', 'LIKE', '%' . $name . '%');
            });
        }

        $contactsRenters = $contactsRenters->get();

        $retVal = [];

        foreach ($contactsStaffs as $contactsStaff) {

            $retVal[] = [
                'id' => $contactsStaff->id,
                'name' => empty($contactsStaff->name) ? $contactsStaff->first_name . ' ' . $contactsStaff->last_name : $contactsStaff->name,
                'image' => $contactsStaff->image,
                'type' => $contactsStaff->type,
                'phone' => $contactsStaff->phone,
                'hostel' => null,
                'room' => null,
            ];
        }

        foreach ($contactsRenters as $contactsRenter) {

            $roomId = $contactsRenter->room_id;

            $room = null;
            $hostel = null;

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

            if ($roomItem) {
                $room = [
                    'name' => $roomItem->name,
                    'id' => $roomItem->id,
                ];

                if ($roomItem->hostel) {
                    $hostel = [
                        'name' => $roomItem->hostel->name,
                        'id' => $roomItem->hostel->id,
                    ];
                }
            }

            $retVal[] = [
                'id' => $contactsRenter->id,
                'name' => empty($contactsRenter->name) ? $contactsRenter->first_name . ' ' . $contactsRenter->last_name : $contactsRenter->name,
                'image' => $contactsRenter->image,
                'phone' => $contactsRenter->phone,
                'room' => $room,
                'hostel' => $hostel,
                'type' => $contactsRenter->type,

            ];
        }

        return response($retVal);
    }

    public function getConversation(Request $request)
    {
        $conversationId = $request->input('conversation');
        $roomId = $request->input('room_id');

        if (!empty($conversationId)) {
            $item = Conversation::find($conversationId);

        } else {
            $item = Conversation::where('room_id', $roomId)->first();
            if (!$item) {
                $item = Functions::createRoomConversation($roomId, auth('backend')->user()->id);
            }
        }

        if (!$item) {
            return response([
                'status' => 0,
                'message' => 'Dữ liệu không hợp lệ'
            ]);
        }

        $participants = [];
        $lastMessageArr = [];

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

        $userAdmins = \DB::table('user_conversations')
            ->where('conversation_id', $item->id)
            ->pluck('is_admin')->toArray();

        foreach ($userIds as $key => $userId) {
            $user = User::find($userId);
            if ($user) {
                $isAdmin = false;
                if (isset($userAdmins[$key])) {
                    if ($userAdmins[$key] == 1) {
                        $isAdmin = true;
                    }
                }

                $participants[] = [

                    'id' => $user->id,
                    'name' => empty($user->name) ? $user->first_name . ' ' . $user->last_name : $user->name,
                    'image' => $user->image,
                    'phone' => $user->phone,
                    'address' => $user->address,
                    'gender' => $user->gender,
                    'email' => $user->email,
                    'is_admin' => $isAdmin

                ];
            }
        }

        $conversationName = $item->name;
        $conversationImage = $item->image;

        if (count($userIds) == 2) {
            if (empty($item->hostel_id)) {
                foreach ($userIds as $userId) {
                    if ($userId != auth('backend')->user()->id) {
                        $user = User::find($userId);
                        if ($user) {
                            $conversationName = $user->name_text;
                            $conversationImage = $user->image;
                        }
                    }
                }
            }
        }

        if (str_contains($conversationImage, '/files/')) {
            $conversationImage = '/files/' . str_replace('/files/', '', $conversationImage);
        } else {
            if (!str_contains($conversationImage, '/frontend3/')) {
                $conversationImage = '/files/' . $conversationImage;
            }
        }


        $lastMessage = $item->lastMessageItem;

        if ($lastMessage) {
            $content = $lastMessage->content;
            if ($lastMessage->type == Message::TYPE_IMAGE || $lastMessage->type == Message::TYPE_SYSTEM) {
                if ($lastMessage->from == auth('backend')->user()->id) {
                    if ($lastMessage->type == Message::TYPE_IMAGE) {
                        $content = 'Bạn đã gửi một ảnh';
                    } else {
                        $content = 'Bạn ' . $content;
                    }
                } else {
                    $fromUser = $lastMessage->fromUser;
                    if ($fromUser) {
                        if ($lastMessage->type == Message::TYPE_IMAGE) {
                            $content = $fromUser->name_text . ' đã gửi một ảnh';
                        } else {
                            $content = $fromUser->name_text .' '. $content;
                        }
                    }
                }
            }


            $lastMessageArr = [
                'content' => $content,
                'created_at' => $lastMessage->created_at->format('d/m/Y H:i:s'),
                'is_read' => $item->last_message_is_read
            ];
        }

        $canDelete = true;
        if (!empty($item->hostel_id) || !empty($item->room_id)) {
            $canDelete = false;
        }

        $canReply = true;
        if (str_contains($item->members, '7204')) {
            $canReply = false;
        }

        $isGroup = false;

        if (count($userIds) > 2) {
            $isGroup = true;
        } else if (count($userIds) == 2) {
            if (!empty($item->hostel_id)) {
                $isGroup = true;
            }
        }
        $retVal = [
            'info' => [
                'id' => $item->id,
                'name' => $conversationName,
                'image' => $conversationImage,
                'can_delete' => $canDelete,
                'can_reply' => $canReply,
                'is_group' => $isGroup
            ],
            'participants' => $participants,
            'last_message' => $lastMessageArr
        ];

        return response([
            'sidebar' => view('frontend3.chat.sidebar', compact('retVal'))->render(),
            'title' => $conversationName
        ]);

    }

    public function getMessageByConservation(Request $request)
    {
        $limit = $request->input('limit', 40);
        $lastId = $request->input('last_id', 0);
        $conversationId = $request->input('conversation');

        $conversation = Conversation::find($conversationId);

        if (!$conversation) {
            return response([
                'status' => 0,
                'message' => 'Dữ liệu không hợp lệ'
            ]);
        }

        $conversation->last_message_is_read = true;
        $conversation->save();

        $messages = Message::where('conversation_id', $conversationId)
            ->limit($limit)
            ->orderBy('id', 'desc');

        if (!empty($lastId)) {
            $messages = $messages->where('id', '<', $lastId);
        }

        $messages = $messages->get();

        $messagesRes = clone $messages;

        $messages = $messages->reverse();


        foreach ($messages as $message) {

            $from = $message->from;
            $userFrom = User::withTrashed()->find($from);

            if ($userFrom) {

                $message->user_from = [
                    'id' => $userFrom->id,
                    'name' => $userFrom->name_text,
                    'image' => $userFrom->image,
                    'phone' => $userFrom->phone,
                ];

                if ($message->type == Message::TYPE_SYSTEM) {

                    if ($userFrom) {
                        if ($userFrom->id == auth('backend')->user()->id) {
                            $message->content = 'Bạn ' . $message->content;
                        } else {
                            $message->content = $userFrom->name_text .' '. $message->content;
                        }
                    }
                }
            }
        }
        $lastIdReturn = null;

        if ($messages->first()) {
            $lastIdReturn = $messages->first()->id;
        }
        \DB::table('user_conversations')
            ->where('conversation_id', $conversationId)
            ->where('user_id', auth('backend')->user()->id)
            ->update([
                'is_read_last_message' => true
            ]);


        $messageGroup = [];
        $retVal = [];
        if (!empty($messagesRes->count())) {

            $previous = $messagesRes[0]->from;
            $previousType = $messagesRes[0]->type;


            foreach ($messagesRes as $key => $messageItem) {

                if ($messageItem->from == $previous && $messageItem->type == $previousType) {
                    $messageGroup[] = $messageItem;
                    $userFrom = $messageItem->fromUser;
                    $previous = $messageItem->from;
                    $previousType = $messageItem->type;

                    if ($key == 0) {
                        $newKey = 0;
                    } else {
                        $newKey = $key - 1;
                    }
                    if ($key + 1 == $messagesRes->count()) {
                        $retVal[] = [
                            'user' => $userFrom,
                            'message' => $messageGroup,
                            'type' => $messagesRes[$newKey]->type
                        ];
                    }

                    continue;
                } else {
                    $retVal[] = [
                        'user' => $userFrom,
                        'message' => $messageGroup,
                        'type' => $messagesRes[$key - 1]->type
                    ];
                    $messageGroup = [];
                    $messageGroup[] = $messageItem;
                    $userFrom = $messageItem->fromUser;
                    $previous = $messageItem->from;
                    $previousType = $messageItem->type;

                    if ($key + 1 == $messagesRes->count()) {
                        $retVal[] = [
                            'user' => $userFrom,
                            'message' => $messageGroup,
                            'type' => $messageItem->type
                        ];
                    }

                }


            }

        }
        $retVal = array_reverse($retVal);


        return response([
            'status' => 1,
            'data' => $lastIdReturn,
            'html' => view('frontend3.chat.messages_2', [
                'messages' => $retVal,
                'conversation' => $conversation
            ])->render()
        ]);

    }

    public function getDataTo(Request $request)
    {
        $to = $request->input('to');
        $user = User::find($to);
        if ($user) {
            return response([
                'html' => view('frontend3.chat.to_info', compact('user'))->render(),
                'header' => view('frontend3.chat.header_to_info', compact('user'))->render(),
            ]);
        }
    }

    public function authPresence(Request $request)
    {
        return $this->pusher->presence_auth($request->input('channel_name'),
            $request->input('socket_id'), auth('backend')->user()->id, [
                'id' => auth('backend')->user()->id,
                'name' => auth('backend')->user()->name_text
            ]);
    }

    public function index(Request $request)
    {
        if (!auth('backend')->check()) {
            return redirect()->to(url('/'))->with('error', 'Bạn cần đăng nhập để sử dụng tính năng này');
        }

        $limit = $request->input('limit', 10);
        $offset = $request->input('offset', 0);

        $items = Conversation::query()->select(\DB::raw('conversations.*'))
            ->join('user_conversations', 'user_conversations.conversation_id', '=', 'conversations.id')
            ->where('user_conversations.user_id', auth('backend')->user()->id)
            ->orderBy('last_message_time', 'desc')
            ->whereNotNull('conversations.last_message_id')
            // ->limit($limit)
            //->offset($offset)
            ->get();

        $retVal = [];
        foreach ($items as $item) {
            $participants = [];
            $lastMessageArr = [];

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


            foreach ($userIds as $userId) {
                $user = User::find($userId);
                if ($user) {
                    $participants[] = [
                        'id' => $user->id,
                        'name' => empty($user->name) ? $user->first_name . ' ' . $user->last_name : $user->name,
                        'image' => $user->image,
                        'phone' => $user->phone
                    ];
                }
            }

            $conversationName = $item->name;
            $conversationImage = $item->image;

            if (count($userIds) == 2) {
                if (empty($conversationName)) {
                    foreach ($userIds as $userId) {
                        if ($userId != auth('backend')->user()->id) {
                            $user = User::find($userId);
                            if ($user) {
                                $conversationName = $user->name_text;
                                $conversationImage = $user->image;
                            }
                        }
                    }
                }
            }

            if (str_contains($conversationImage, '/files/')) {
                $conversationImage = '/files/' . str_replace('/files/', '', $conversationImage);
            } else {
                if (!str_contains($conversationImage, '/frontend3/')) {
                    $conversationImage = '/files/' . $conversationImage;
                }
            }


            $lastMessage = $item->lastMessageItem;

            if ($lastMessage) {
                $content = $lastMessage->content;
                if ($lastMessage->type == Message::TYPE_IMAGE || $lastMessage->type == Message::TYPE_SYSTEM) {
                    if ($lastMessage->from == auth('backend')->user()->id) {
                        if ($lastMessage->type == Message::TYPE_IMAGE) {
                            $content = 'Bạn đã gửi một ảnh';
                        } else {
                            $content = 'Bạn ' . $content;
                        }
                    } else {
                        $fromUser = $lastMessage->fromUser;
                        if ($fromUser) {
                            if ($lastMessage->type == Message::TYPE_IMAGE) {
                                $content = $fromUser->name_text . ' đã gửi một ảnh';
                            } else {
                                $content = $fromUser->name_text . ' '. $content;
                            }
                        }
                    }
                }

                $isRead = 0;

                $checkIsRead = \DB::table('user_conversations')
                    ->where('user_id', auth('backend')->user()->id)
                    ->where('conversation_id', $item->id)
                    ->first();

                if ($checkIsRead) {
                    $isRead = $checkIsRead->is_read_last_message;
                }

                $lastMessageArr = [
                    'content' => $content,
                    'created_at' => $lastMessage->created_at->format('d/m/Y H:i:s'),
                    'is_read' => $isRead
                ];
            } else {
	            $lastMessageArr = [
		            'content' => '',
		            'created_at' => Carbon::now()->format('d/m/Y H:i:s'),
		            'is_read' => 0
	            ];
            }

            $retVal[] = [
                'info' => [
                    'id' => $item->id,
                    'name' => $conversationName,
                    'image' => $conversationImage,
                ],
                'participants' => $participants,
                'last_message' => $lastMessageArr
            ];
        }

        if ($request->ajax()) {
            return response([
                'status' => 1,
                'data' => view('frontend3.chat.conversations', [
                    'items' => $retVal
                ])->render()
            ]);
        }



        return view('frontend3.chat.index_2', [
            'items' => $retVal,
        ]);
    }


    public function createConversation($userIds)
    {


        $userIds = array_unique($userIds);


        if (count($userIds) < 2) {
            return 0;
        }

        if (empty($userIds)) {
            return 0;
        }

        if (!is_array($userIds)) {
            return 0;
        }

        sort($userIds);
        $members = implode(',', $userIds);
        $check = Conversation::where('members', $members)->whereNull('room_id')->whereNull('hostel_id')->first();
        if ($check) {
            $conversationId = $check->id;
            $conversation = Conversation::find($conversationId);

            if (!$conversation) {
                $conversation = $this->createConversationModel(null, null, $userIds);
            }

        } else {

            $conversation = $this->createConversationModel(null, null, $userIds);
        }

        if ($conversation == false) {
            return 0;
        }

        $participants = [];
        foreach ($userIds as $userId) {
            $user = User::find($userId);
            $participants[] = [
                'id' => $user->id,
                'name' => empty($user->name) ? $user->first_name . ' ' . $user->last_name : $user->name,
                'image' => $user->image,
                'phone' => $user->phone
            ];
        }

        $conversationName = $conversation->name;
        $conversationImage = $conversation->image;

        if (count($userIds) == 2) {
            foreach ($userIds as $userId) {
                if ($userId != auth('backend')->user()->id) {
                    $user = User::find($userId);
                    if ($user) {
                        $conversationName = $user->name_text;
                        $conversationImage = $user->image;
                    }
                }
            }
        }

        if (str_contains($conversationImage, '/files/')) {
            $conversationImage = '/files/' . str_replace('/files/', '', $conversationImage);
        } else {
            $conversationImage = '/files/' . $conversationImage;
        }

        return $conversation->id;

    }

    public function createConversationModel($image, $name, $userIds)
    {
        if (count($userIds) > 2) {
            if (auth('backend')->user()->type == User::RENTER) {
                $currentRenterRoom = RenterRoom::where('user_id', auth('backend')->user()->id)
                    ->first();
                if ($currentRenterRoom) {
                    if ($currentRenterRoom->hostel) {
                        if ($currentRenterRoom->hostel->owner) {
                            if (!$currentRenterRoom->hostel->owner->allow_renter_make_group) {
                                return false;
                            }
                        }
                    }
                }
            }
        }

        $imageSaved = null;

        if (!empty($image) && $image->isValid()) {
            $imageSaved = Functions::uploadImage($image);
        }

        if (count($userIds) == 2) {
            $name = null;
            $imageSaved = null;
        }


        $channelName = Str::random() . time() . uniqid();

        sort($userIds);

        $conversation = Conversation::create([
            'name' => $name,
            'image' => $imageSaved,
            'channel' => $channelName,
            'members' => implode(',', $userIds),
            'user_id' => auth('backend')->user()->id
        ]);

        $userIdSync = [];

        foreach ($userIds as $userId) {
            if ($userId == auth('backend')->user()->id) {
                $userIdSync[$userId] = [
                    'is_admin' => true
                ];
            } else {
                $userIdSync[$userId] = [
                    'is_admin' => false
                ];
            }
        }

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

        if (count($userIds) > 2) {
            $message = Message::create([
                'content' => ' đã tạo cuộc hội thoại',
                'conversation_id' => $conversation->id,
                'type' => Message::TYPE_SYSTEM,
                'from' => auth('backend')->user()->id
            ]);

            foreach ($userIds as $userId) {

                $messageArr = $message->toArray();
                if ($userId == auth('backend')->user()->id) {
                    $messageArr['content'] = 'Bạn ' . $messageArr['content'];
                } else {
                    $messageArr['content'] = auth('backend')->user()->name_text .' '. $messageArr['content'];
                }
                $this->pusher->trigger('chat-' . $userId, 'new-message', $messageArr);

            }

            if ($conversation) {
                $conversation->last_message = $message->content;
                $conversation->last_message_id = $message->id;
                $conversation->last_message_from = auth('backend')->user()->id;
                $conversation->last_message_time = Carbon::now()->toDateTimeString();
                $conversation->save();
            }
        }

        Functions::updateMemberName($conversation->id);

        return $conversation;
    }

    public function createChat()
    {


    }

    public function push(Request $request)
    {
        $fromID = auth('backend')->user()->id;
        $to = $request->input('to');
        $content = $request->input('content');
        $location = $request->input('location');

        $message = [
            'content' => $content,
            'fromID' => (string)$fromID,
            'isRead' => false,
            'timestamp' => time(),
            'toID' => (string)$to,
            'type' => 'text',
        ];


        if (!empty($location)) {

            $this->firebase->push('/conversations/' . $location . '/messages/', $message);
            $this->firebase->update('/users/' . $fromID . '/conversations/' . $to . '/last_message', $message);
        } else {
            $res = $this->firebase->push('/conversations/', [
                'messages' => []
            ]);

            $res = json_decode($res, true);

            $location = $res['name'];

            $this->firebase->push('/conversations/' . $res['name'] . '/messages/', $message);
            $this->firebase->set('/users/' . $fromID . '/conversations/' . $to, ['location' => $location]);
            $this->firebase->set('/users/' . $fromID . '/conversations/' . $to . '/last_message', $message);
        }

        $payload = json_encode([
            'id' => auth('backend')->user()->id,
            'type' => config('constants.MESSAGE')
        ]);

        $content = auth('backend')->user()->name . ': ' . $content;

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

        return response([
            'status' => 1,
            'message' => 'Thành công',
            'location' => $location,
            'html' => view('frontend3.chat.message', compact('content', 'location'))->render()
        ]);
    }

    public function reply()
    {

    }
}
