<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Arr;

use App\Http\Requests\ChatSendMessageValidation;

use App\Models\Chat;
use App\Models\User;

use App\Events\ChatMessageCreated;
use App\Events\WhisperCreated;
use App\Events\ChatMessageSelected;

class ChatController extends Controller
{
    public function sendMessage(ChatSendMessageValidation $request)
    {
        $input = requestInput();
        $chat = (new Chat())->saveChat($input);

        $livestream = Chat::findObject(Arr::get($input, 'room'));

        if ($livestream->chat_mode === 'private') {
            if (auth()->user()->can('moderate', $livestream)) {
                if (Arr::get($input, 'whisper_id')) {
                    $whisper_to = User::findOrFail(Arr::get($input, 'whisper_id'));
                    $chat->sendWhisperToUsers($whisper_to);
                    $chat->sendMessageToMods($livestream->moderators);
                } else {
                    broadcast(new ChatMessageCreated($chat));
                }
            } else {
                $chat->sendMessageToMods($livestream->moderators);
            }
        } else {
            if (Arr::get($input, 'whisper_id')) {
                $whisper_to = User::findOrFail(Arr::get($input, 'whisper_id'));
                $chat->sendWhisperToUsers($whisper_to);
            } else {
                broadcast(new ChatMessageCreated($chat));
            }
        }

        return response()->json([
            'chat' => $chat->load('whispers', 'reply'),
        ]);
    }

    public function load()
    {
        Validator::make(request()->all(), [
            'room' => 'required',
        ])->validate();

        if (!Chat::canJoinRoom(request('room'))) {
            return response()->json(['error' => 'You do not have permission to load this chat'], 403);
        }

        $chats = Chat::where('room', request('room'))
            ->where('created_at', '>', now()->subHours(12))
            ->where(function ($query) {
                $query->whereHas('whispers', function ($query) {
                    $query->where('user_id', auth()->user()->id);
                })
                ->orWhereDoesntHave('whispers')
                ->orWhere('user_id', auth()->user()->id);
            })
            ->with('whispers')
            ->get()
            ->sortByDesc(function ($chat) {
                return $chat->created_at.'-'.$chat->id;
            })
            ->values();

        return response()->json([
            'chats' => $chats->load('whispers', 'reply'),
        ]);
    }

    public function destroy($id)
    {
        $chat = Chat::findOrFail($id);

        if (!auth()->user()->can('delete', $chat)) {
            return response()->json(['error' => 'You do not have permission to delete chat messages'], 403);
        }

        $chat->delete();

        return response()->json(['success' => 'Message Deleted']);
    }

    public function view($room)
    {
        if (!Chat::canJoinRoom($room)) {
            return redirect('/')->with(['error' => 'You do not have permission to view that chat room']);
        }

        $object = Chat::findObject($room);

        return view('chat.view', compact('object', 'room'));
    }

    public function toggleSelected($id)
    {
        $chat = Chat::findOrFail($id);

        if (!auth()->user()->can('select', $chat)) {
            return response()->json(['error' => 'You do not have permission to select chat messages'], 403);
        }

        $chat->selected = !$chat->selected;
        $chat->save();

        broadcast(new ChatMessageSelected($chat->makeHidden('message')))->toOthers();

        return response()->json([
            'chat' => $chat,
            'success' => 'Message Toggled'
        ]);
    }
}
