<?php

namespace App\Http\Controllers\api\v1;

use App\Components\Functions;
use App\Models\Hostel;
use App\Models\Notification;
use App\Models\RenterRoom;
use App\Models\Room;
use App\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Api\v1\BaseController;
use LaravelFCM\Message\OptionsBuilder;
use LaravelFCM\Message\PayloadDataBuilder;
use LaravelFCM\Message\PayloadNotificationBuilder;

class NotificationController extends BaseController
{
    //
    public function getItems(Request $request)
    {
        $limit = $request->input('limit', 5);
        $lastId = $request->input('last_id');
        $items = Notification::publish()->with(['imagesOwner', 'hostel', 'room']);

        if ($this->user) {
            $items = $items->where('notifications.to_user', $this->user->id);
        }

//        $items = $items->with([
//            'hostel' =>  function($q) {
//                return $q->select('name');
//            }
//        ])->with([
//            'room' =>  function($q) {
//                return $q->select('name');
//            }
//        ]);

        //$items = $items->groupBy( 'notifications.hostel_id', 'notifications.room_id' );

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

        $items = $items->limit($limit)->orderBy('notifications.id', 'desc')->get();

        foreach ($items as $item) {
            $item->hostel = optional($item->hostel)->name;
            $item->room = optional($item->room)->name;
            $imageArr = [];
            $images = $item->imagesOwner;
            foreach ($images as $image)
            {
                $imageArr[] = '/files/'.$image->image;
            }
            $item->images = $imageArr;
            $item->payload = json_decode($item->payload, true);
            $item->content = html_entity_decode(strip_tags($item->content));
        }

        return response([
            'status' => 1,
            'data' => $items
        ]);
    }

    public function setReadNotification(Request $request)
    {
        $userId = $this->user->id;
        $notificationId = $request->input('notification_id');

        if (!empty($notificationId)) {
            $notification = Notification::find($notificationId);
            if ($notification) {
                $notification->is_read = Notification::READ;
                $notification->save();
            }
        } else {
            Notification::where('to_user', $userId)->update([
                'is_read' => Notification::READ
            ]);
        }

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

    public function countUnReadNotification(Request $request)
    {
        $userId = $this->user->id;

        $cnt = Notification::where('to_user', $userId)->where('is_read', Notification::NOT_READ)->count();

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

    public function create(Request $request)
    {
        $hostels = $request->input('hostels');
        $rooms = $request->input('rooms');
        $title = $request->input('title');
        $content = $request->input('content');


        if (empty($content)) {
            return response([
                'status' => 0,
                'message' => 'Không được bỏ trống nội dung'
            ]);
        }


        if ($this->user) {
            if ($this->user->type == User::OWNER) {
                if (empty($hostels)) {
                    $hostels = Hostel::where('owner_id', $this->user->id)
                        ->pluck('id')->toArray();

                    $rooms = Room::wherein('hostel_id', $hostels)->pluck('id')->toArray();
                } else {
                    $hostels = json_decode($hostels, true);

                    if (!empty($rooms)) {
                        $rooms = json_decode($rooms, true);
                    }
                }

            }
        }

        if (is_array($hostels)) {
            foreach ($hostels as $hostel) {

                if (is_array($rooms)) {
                    foreach ($rooms as $room) {

                        $renterRooms = RenterRoom::where('room_id', $room)->get();

                        foreach ($renterRooms as $renterRoom) {

                            Notification::create([
                                'hostel_id' => $hostel,
                                'room_id' => $room,
                                'title' => $title,
                                'to_user' => $renterRoom->user_id,
                                'content' => $content,
                                'user_id' => $this->user->id
                            ]);
                        }

                    }
                }

            }
        }

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

    }

    public function sendNotificationMessage(Request $request)
    {
        $content = $request->input('content');
        $receiver = $request->input('receiver_id');

        $user = User::find($receiver);

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

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

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

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

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