import { NextResponse } from "next/server"
import { z } from "zod"

import { db } from "@/lib/db"

/**
 * @swagger
 * /api/gweets/{id}:
 *   get:
 *     description: Gives back a List of Gweets
 *     parameters:
 *       - name: id
 *         in: path
 *         description: ID of Gweet that needs to be fetched
 *         required: true
 *         schema:
 *           type: integer
 *           format: int64
 *     content:
 *      application/json:
 *          schema:
 *     responses:
 *       200:
 *         description: fetched gweets!
 *       400:
 *         description: Invalid request body!  
 *       404:
 *         description: Gweet not found! 
 *       500:
 *         description: Error 
 */

export async function GET(request: Request, { params }: { params: { id: string } }) {
    const { id } = params

    const gweetIdSchema = z.string().cuid()

    const zod = gweetIdSchema.safeParse(id)

    if (!zod.success) {
        return NextResponse.json({
            message: "Invalid request body",
            error: zod.error.formErrors,
        }, { status: 400 })
    }

    try {
        const gweet = await db.gweet.findUnique({
            where: {
                id,
            },
            include: {
                author: {
                    select: {
                        id: true,
                        username: true,
                        name: true,
                        image: true,
                    },
                },
                likes: {
                    include: {
                        user: {
                            include: {
                                followers: true,
                            },
                        },
                    },
                    orderBy: {
                        createdAt: "desc",
                    },
                },
                media: true,
                regweets: {
                    include: {
                        user: {
                            include: {
                                followers: true,
                            },
                        },
                    },
                    orderBy: {
                        createdAt: "desc",
                    },
                },
                quote: {
                    include: {
                        author: true,
                        media: true,
                    },
                },
                allQuotes: {
                    include: {
                        likes: true,
                        regweets: true,
                        author: true,
                        quote: {
                            include: {
                                author: true,
                            },
                        },
                    },

                    orderBy: {
                        createdAt: "desc",
                    },
                },
                comment: {
                    include: {
                        author: {
                            select: {
                                id: true,
                                username: true,
                            },
                        },
                    },
                },
                allComments: true,
            },
        })

        if (!gweet) {
            return NextResponse.json({
                message: "Gweet not found",
            }, { status: 404 })
        }

        return NextResponse.json(gweet, { status: 200 })
    } catch (error) {
        return NextResponse.json({
            message: "Something went wrong",
            error,
        }, { status: 500 })
    }
}