import { FastifyInstance } from "fastify";
import { ZodTypeProvider } from "fastify-type-provider-zod";
import { z } from "zod";
import { generateSlug } from "../../utils/generate-slug"
import { prisma } from "../../lib/prisma";
import { BadRequest } from "../_errors/bad-request";

export async function updateCourse(app: FastifyInstance) {
  app
    .withTypeProvider<ZodTypeProvider>()
    .put('/courses/:id', {
      schema: {
        summary: 'Update a course',
        tags: ['courses'],
        params: z.object({
          id: z.string().cuid(),
        }),
        body: z.object({
          title: z.string().min(4).optional(),
          description: z.string().optional(),
          image: z.string().optional(),
          certificate: z.boolean().optional(),
        }),
        response: {
          200: z.object({
            message: z.string(),
          }),
        },
      },
    }, async (request, reply) => {
      const courseId = request.params.id;
      const {
        title,
        description,
        image,
        certificate,
      } = request.body;

      // Verifique se o curso existe
      const existingCourse = await prisma.course.findUnique({
        where: {
          id: courseId,
        },
      });

      if (!existingCourse) {
        throw new BadRequest('Course not found.');
      }

      let slug = existingCourse.slug;
      if (title && title !== existingCourse.title) {
        slug = generateSlug(title);
      }

      // Atualize os dados do curso
      const updatedCourse = await prisma.course.update({
        where: {
          id: courseId,
        },
        data: {
          title: title ?? existingCourse.title,
          description: description ?? existingCourse.description,
          slug: slug?? existingCourse.slug,
          image: image ?? existingCourse.image,
          certificate: certificate ?? existingCourse.certificate,
          status: true,
        },
      });

      return reply.status(200).send({ message: 'Course updated successfully.' });
    });
}
