import { Request, Response } from 'express';
import { SmartSalesService } from '../services/smart-sales.service';
import { sendSuccess, sendError } from '../utils/response.utils';

// 1. Frequently Bought Together
export const getFrequentlyBoughtTogether = async (req: Request, res: Response) => {
  try {
    const bookId = req.params.bookId;
    if (!bookId) return sendError(res, 'Book ID is required', null, 400);

    const fbt = await SmartSalesService.getFrequentlyBoughtTogether(bookId);
    return sendSuccess(res, 'Frequently bought together combo retrieved', fbt);
  } catch (error: any) {
    return sendError(res, 'Failed to get frequently bought together items', error.message, 500);
  }
};

// 2. Bundles & Combos List
export const getBundles = async (req: Request, res: Response) => {
  try {
    const isCombo = req.query.isCombo === 'true' ? true : req.query.isCombo === 'false' ? false : undefined;
    const bundles = await SmartSalesService.getBundlesAndCombos(isCombo);
    return sendSuccess(res, 'Bundles retrieved successfully', { bundles });
  } catch (error: any) {
    return sendError(res, 'Failed to get bundles', error.message, 500);
  }
};

// 3. Dynamic Tier Discounts Calculator
export const getTierDiscounts = async (req: Request, res: Response) => {
  try {
    const quantity = parseInt(req.query.quantity as string, 10) || 1;
    const subtotal = parseFloat(req.query.subtotal as string) || 0;

    const discountResult = SmartSalesService.calculateTierDiscount(quantity, subtotal);
    return sendSuccess(res, 'Tier discount calculated', discountResult);
  } catch (error: any) {
    return sendError(res, 'Failed to calculate tier discount', error.message, 500);
  }
};

// 4. Flash Deals
export const getFlashDeals = async (_req: Request, res: Response) => {
  try {
    const deals = await SmartSalesService.getFlashDeals();
    return sendSuccess(res, 'Flash deals retrieved', { deals });
  } catch (error: any) {
    return sendError(res, 'Failed to get flash deals', error.message, 500);
  }
};

// 5. Upsells & Edition Upgrades
export const getUpsells = async (req: Request, res: Response) => {
  try {
    const bookId = req.params.bookId;
    if (!bookId) return sendError(res, 'Book ID is required', null, 400);

    const upsells = await SmartSalesService.getUpsellRecommendations(bookId);
    return sendSuccess(res, 'Upsell recommendations retrieved', { upsells });
  } catch (error: any) {
    return sendError(res, 'Failed to get upsells', error.message, 500);
  }
};

// 6. Cross-Sells for Cart / Checkout
export const getCrossSells = async (req: Request, res: Response) => {
  try {
    const bookIdsParam = req.query.bookIds as string;
    const bookIds = bookIdsParam ? bookIdsParam.split(',') : [];
    const limit = req.query.limit ? parseInt(req.query.limit as string, 10) : 4;

    const crossSells = await SmartSalesService.getCrossSellRecommendations(bookIds, limit);
    return sendSuccess(res, 'Cross-sell recommendations retrieved', { crossSells });
  } catch (error: any) {
    return sendError(res, 'Failed to get cross-sells', error.message, 500);
  }
};

// 7. Festival Campaigns
export const getCampaigns = async (_req: Request, res: Response) => {
  try {
    const campaigns = await SmartSalesService.getActiveCampaigns();
    return sendSuccess(res, 'Active festival campaigns retrieved', { campaigns });
  } catch (error: any) {
    return sendError(res, 'Failed to get campaigns', error.message, 500);
  }
};
