import { Request, Response } from 'express';
import Gallery from '../schema/gallery.schema';
import { buildTextSearch, parsePagination, paginationMeta } from '../../../helpers/query.helper';
import { deleteUploadFile } from '../../../helpers/upload-file.helper';

export class GalleryController {
  static async listPublic(req: Request, res: Response) {
    try {
      const response = await Gallery.find({ isPublished: true }).sort({ sortOrder: 1, createdAt: -1 });
      return res.status(200).json({ success: true, response });
    } catch {
      return res.status(500).json({ success: false, message: 'System error' });
    }
  }

  static async listAdmin(req: Request, res: Response) {
    try {
      const { page, limit, skip } = parsePagination(req, 12);
      const filter: Record<string, unknown> = {};

      const category = String(req.query.category || '').trim();
      if (category) filter.category = category;

      const published = String(req.query.published || '').trim();
      if (published === 'true') filter.isPublished = true;
      if (published === 'false') filter.isPublished = false;

      const search = buildTextSearch(['title', 'category', 'imageUrl'], String(req.query.q || ''));
      if (search.$or) Object.assign(filter, search);

      const [response, total] = await Promise.all([
        Gallery.find(filter).sort({ sortOrder: 1, createdAt: -1 }).skip(skip).limit(limit),
        Gallery.countDocuments(filter),
      ]);

      return res.status(200).json({
        success: true,
        response,
        pagination: paginationMeta(page, limit, total),
      });
    } catch {
      return res.status(500).json({ success: false, message: 'System error' });
    }
  }

  static async create(req: Request, res: Response) {
    try {
      const { title, category, imageUrl, sortOrder, isPublished } = req.body;
      if (!title || !imageUrl) {
        return res.status(400).json({ success: false, message: 'Title and image are required' });
      }

      const item = await Gallery.create({ title, category, imageUrl, sortOrder, isPublished });
      return res.status(201).json({ success: true, response: item });
    } catch {
      return res.status(500).json({ success: false, message: 'System error' });
    }
  }

  static async update(req: Request, res: Response) {
    try {
      const existing = await Gallery.findById(req.params.id);
      if (!existing) return res.status(404).json({ success: false, message: 'Not found' });

      const nextImageUrl = req.body.imageUrl;
      if (nextImageUrl && nextImageUrl !== existing.imageUrl) {
        deleteUploadFile(existing.imageUrl);
      }

      const item = await Gallery.findByIdAndUpdate(req.params.id, req.body, { new: true });
      return res.status(200).json({ success: true, response: item });
    } catch {
      return res.status(500).json({ success: false, message: 'System error' });
    }
  }

  static async remove(req: Request, res: Response) {
    try {
      const item = await Gallery.findByIdAndDelete(req.params.id);
      if (!item) return res.status(404).json({ success: false, message: 'Not found' });

      deleteUploadFile(item.imageUrl);

      return res.status(200).json({ success: true, message: 'Deleted' });
    } catch {
      return res.status(500).json({ success: false, message: 'System error' });
    }
  }
}
