import nc from 'next-connect';
import { getToken } from 'next-auth/jwt';
import multer from 'multer';
import path from 'path';
import DatauriParser from 'datauri/parser';
import cloudinary from '../../utils/cloudinary';
import { getXataClient } from '../../utils/xata';

const xata = getXataClient();

const handler = nc({
  onError: (res) => {
    res.status(500).end('Something broke!');
  },
  onNoMatch: (req, res) => {
    res.status(404).end('Page is not found');
  },
})
  // uploading two files
  .use(multer().any())
  .post(async (req, res) => {
    // get user's token
    const token = await getToken({ req });

    // if no token
    if (!token) {
      return res.status(401).json({ error: 'You are not signed in', data: null });
    }
    // get parsed image and video from multer
    const image = req.files.filter((file) => file.fieldname === 'image')[0];
    const video = req.files.filter((file) => file.fieldname === 'video')[0];
    // create a neew Data URI parser
    const parser = new DatauriParser();
    try {
      // create image
      const createImage = async (img) => {
        const base64Image = parser.format(path.extname(img.originalname).toString(), img.buffer);
        const uploadedImageResponse = await cloudinary.uploader.upload(base64Image.content, 'flashcards', { resource_type: 'image' });
        return uploadedImageResponse;
      };

      // create video
      const createVideo = async (vid) => {
        const base64Video = parser.format(path.extname(vid.originalname).toString(), vid.buffer);
        const uploadedVideoResponse = await cloudinary.uploader.upload(base64Video.content, 'flashcards', { resource_type: 'video' });
        return uploadedVideoResponse;
      };

      // saving information
      const createdImage = await createImage(image);
      const imageUrl = createdImage.url;
      const image_id = createdImage.public_id;
      const image_signature = createdImage.signature;
      const createdVideo = video ? await createVideo(video) : null;
      const videoUrl = createdVideo?.url;
      const video_id = createdVideo?.public_id;
      const video_signature = createVideo?.signature;

      // creating a new card
      const card = await xata.db.Cards.create({
        name: req.body.cardName,
        category: req.body.category,
        color: req.body.cardColor,
        front: req.body.front,
        back: req.body.back,
        image: imageUrl,
        image_id,
        image_signature,
        video: videoUrl,
        video_id,
        video_signature,
        user: token.user.id,
      });
      res.json({ error: null, data: card });
    } catch (error) {
      res.status(500).json({ error, data: null });
    }
  });

// disable body parser
export const config = {
  api: {
    bodyParser: false,
  },
};

export default handler;