import { Request, Response } from 'express';
import prisma from '../config/database';
import { sendSuccess, sendError } from '../utils/response.utils';
import { AuthenticatedRequest } from '../middleware/auth.middleware';

// 1. List all banners (Public)
export const getBanners = async (req: Request, res: Response) => {
  try {
    const banners = await prisma.banner.findMany({
      where: { isActive: true },
      orderBy: { sortOrder: 'asc' },
    });
    return sendSuccess(res, 'Active banners retrieved', { banners });
  } catch (error: any) {
    return sendError(res, 'Failed to fetch banners', error.message, 500);
  }
};

// 2. Admin: List all banners (including inactive ones)
export const getAdminBanners = async (req: AuthenticatedRequest, res: Response) => {
  try {
    if (res.locals.userRole !== 'ADMIN' && req.user?.role !== 'ADMIN') {
      return sendError(res, 'Forbidden', null, 403);
    }
    const banners = await prisma.banner.findMany({
      orderBy: { sortOrder: 'asc' },
    });
    return sendSuccess(res, 'Admin banners list retrieved', { banners });
  } catch (error: any) {
    return sendError(res, 'Failed to fetch banners list', error.message, 500);
  }
};

// 3. Admin: Create banner
export const createBanner = async (req: AuthenticatedRequest, res: Response) => {
  try {
    const { title, imageUrl, linkUrl, sortOrder, isActive } = req.body;
    if (res.locals.userRole !== 'ADMIN' && req.user?.role !== 'ADMIN') {
      return sendError(res, 'Forbidden', null, 403);
    }

    const banner = await prisma.banner.create({
      data: {
        title,
        imageUrl,
        linkUrl,
        sortOrder: sortOrder ? parseInt(sortOrder) : 0,
        isActive: isActive ?? true,
      },
    });

    return sendSuccess(res, 'Banner created successfully', { banner });
  } catch (error: any) {
    return sendError(res, 'Failed to create banner', error.message, 500);
  }
};

// 4. Admin: Update banner details
export const updateBanner = async (req: AuthenticatedRequest, res: Response) => {
  try {
    const { id } = req.params;
    const { title, imageUrl, linkUrl, sortOrder, isActive } = req.body;
    if (res.locals.userRole !== 'ADMIN' && req.user?.role !== 'ADMIN') {
      return sendError(res, 'Forbidden', null, 403);
    }

    const banner = await prisma.banner.findUnique({ where: { id } });
    if (!banner) return sendError(res, 'Banner not found', null, 404);

    const updated = await prisma.banner.update({
      where: { id },
      data: {
        title,
        imageUrl,
        linkUrl,
        sortOrder: sortOrder !== undefined ? parseInt(sortOrder) : undefined,
        isActive: isActive !== undefined ? isActive : undefined,
      },
    });

    return sendSuccess(res, 'Banner updated successfully', { banner: updated });
  } catch (error: any) {
    return sendError(res, 'Failed to update banner', error.message, 500);
  }
};

// 5. Admin: Delete banner
export const deleteBanner = async (req: AuthenticatedRequest, res: Response) => {
  try {
    const { id } = req.params;
    if (res.locals.userRole !== 'ADMIN' && req.user?.role !== 'ADMIN') {
      return sendError(res, 'Forbidden', null, 403);
    }

    await prisma.banner.delete({ where: { id } });
    return sendSuccess(res, 'Banner deleted successfully');
  } catch (error: any) {
    return sendError(res, 'Failed to delete banner', error.message, 500);
  }
};
