<?php

namespace App\Http\Controllers;

use App\Models\Comment;
use App\Models\CommentLike;
use App\Models\Video;
use App\Notifications\NewCommentLikeNotification;
use App\Notifications\NewCommentNotification;
use App\Notifications\NewReplyNotification;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class CommentController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth')->except(['index']);
    }

    public function index(Video $video)
    {
        $comments = $video->comments()->whereNull('parent_id')->with(['user', 'replies.user'])->get();

        return response()->json($comments);
    }

    public function store(Request $request, Video $video)
    {
        $request->validate([
            'body'      => 'required|string|max:1000',
            'parent_id' => 'nullable|exists:comments,id',
        ]);

        $commenter = Auth::user();

        $comment = $video->comments()->create([
            'user_id'   => $commenter->id,
            'body'      => $request->body,
            'parent_id' => $request->parent_id,
        ]);

        $comment->load('user:id,name,avatar');

        // Fire notifications (never notify yourself)
        if ($request->parent_id) {
            // Reply — notify the parent comment's author
            $parent = Comment::find($request->parent_id);
            if ($parent && $parent->user_id !== $commenter->id) {
                $parent->user->notify(new NewReplyNotification($video, $comment, $commenter));
            }
        } else {
            // Top-level comment — notify the video owner
            if ($video->user_id !== $commenter->id) {
                $video->user->notify(new NewCommentNotification($video, $comment, $commenter));
            }
        }

        return response()->json([
            'success' => true,
            'comment' => $comment->load('user:id,name,avatar'),
        ]);
    }

    public function update(Request $request, Comment $comment)
    {
        if ($comment->user_id !== Auth::id()) {
            return response()->json(['error' => 'Unauthorized'], 403);
        }

        $request->validate([
            'body' => 'required|string|max:1000',
        ]);

        $comment->update(['body' => $request->body]);
        $comment->load('user:id,name,avatar');

        return response()->json($comment->load('user:id,name,avatar'));
    }

    public function destroy(Comment $comment)
    {
        if ($comment->user_id !== Auth::id()) {
            return response()->json(['error' => 'Unauthorized'], 403);
        }

        $comment->delete();

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

    public function like(Comment $comment)
    {
        $userId  = Auth::id();
        $existing = CommentLike::where('comment_id', $comment->id)
                                ->where('user_id', $userId)
                                ->first();

        if ($existing) {
            $existing->delete();
            $liked = false;
        } else {
            CommentLike::create(['comment_id' => $comment->id, 'user_id' => $userId]);
            $liked = true;

            // Notify the comment author (not self-likes)
            if ($comment->user_id !== $userId) {
                $video = $comment->video;
                if ($video) {
                    $comment->user->notify(
                        new NewCommentLikeNotification($video, $comment, Auth::user())
                    );
                }
            }
        }

        $count = CommentLike::where('comment_id', $comment->id)->count();

        return response()->json(['liked' => $liked, 'count' => $count]);
    }
}
