import * as express from 'express';
import { Request, Response } from 'express';
import multer from 'multer';
import { authentification } from '../../../middlewares/authentication.middleware';
import { authorization } from '../../../middlewares/authorization.middleware';
import { Roles } from '../../auth/enums/roles.enum';
import { GalleryController } from '../controllers/gallery.controller';
import { upload } from '../../../helpers/uploader';

interface MulterRequest extends Request {
  file?: multer.File;
}

const Router = express.Router();

Router.get('/', (req: Request, res: Response) => {
  void GalleryController.listPublic(req, res);
});

Router.get(
  '/admin',
  authentification,
  authorization([Roles.ADMIN]),
  (req: Request, res: Response) => {
    void GalleryController.listAdmin(req, res);
  }
);

Router.post(
  '/',
  authentification,
  authorization([Roles.ADMIN]),
  (req: Request, res: Response) => {
    void GalleryController.create(req, res);
  }
);

Router.post(
  '/upload',
  authentification,
  authorization([Roles.ADMIN]),
  upload.single('image'),
  (req: MulterRequest, res: Response) => {
    if (!req.file) {
      res.status(400).json({ success: false, message: 'No file uploaded' });
      return;
    }
    const imageUrl = `/uploads/${req.file.filename}`;
    res.status(201).json({ success: true, response: { imageUrl } });
  }
);

Router.patch(
  '/:id',
  authentification,
  authorization([Roles.ADMIN]),
  (req: Request, res: Response) => {
    void GalleryController.update(req, res);
  }
);

Router.delete(
  '/:id',
  authentification,
  authorization([Roles.ADMIN]),
  (req: Request, res: Response) => {
    void GalleryController.remove(req, res);
  }
);

export default Router;
