import { Response } from 'express';
import { AuthenticatedRequest } from '../middleware/auth.middleware';
import { WishlistService } from '../services/wishlist.service';
import { sendSuccess, sendError } from '../utils/response.utils';

// 1. Get User's Complete Wishlist
export const getWishlist = async (req: AuthenticatedRequest, res: Response) => {
  try {
    const userId = req.user?.userId;
    if (!userId) return sendError(res, 'Unauthorized - Login required', null, 401);

    const wishlistData = await WishlistService.getUserWishlist(userId);
    return sendSuccess(res, 'Wishlist retrieved successfully', wishlistData);
  } catch (error: any) {
    return sendError(res, 'Failed to retrieve wishlist', error.message, 500);
  }
};

// 2. Toggle Book in Wishlist (Add/Remove)
export const toggleWishlistItem = async (req: AuthenticatedRequest, res: Response) => {
  try {
    const userId = req.user?.userId;
    const { bookId } = req.body;

    if (!userId) return sendError(res, 'Unauthorized - Login required to save wishlist items', null, 401);
    if (!bookId) return sendError(res, 'Book ID is required', null, 400);

    const result = await WishlistService.toggleWishlistItem(userId, bookId);
    return sendSuccess(res, result.message, result);
  } catch (error: any) {
    return sendError(res, 'Failed to update wishlist item', error.message, 500);
  }
};

// 3. Remove Item from Wishlist
export const removeFromWishlist = async (req: AuthenticatedRequest, res: Response) => {
  try {
    const userId = req.user?.userId;
    const bookId = req.params.bookId || req.body.bookId;

    if (!userId) return sendError(res, 'Unauthorized', null, 401);
    if (!bookId) return sendError(res, 'Book ID parameter is required', null, 400);

    const result = await WishlistService.removeWishlistItem(userId, bookId);
    return sendSuccess(res, result.message, result);
  } catch (error: any) {
    return sendError(res, 'Failed to remove wishlist item', error.message, 500);
  }
};

// 4. Get Wishlist Total Count
export const getWishlistCount = async (req: AuthenticatedRequest, res: Response) => {
  try {
    const userId = req.user?.userId;
    if (!userId) return sendSuccess(res, 'Wishlist count', { count: 0 });

    const count = await WishlistService.getWishlistCount(userId);
    return sendSuccess(res, 'Wishlist count retrieved', { count });
  } catch (error: any) {
    return sendError(res, 'Failed to get wishlist count', error.message, 500);
  }
};

// 5. Clear All Items from Wishlist
export const clearWishlist = async (req: AuthenticatedRequest, res: Response) => {
  try {
    const userId = req.user?.userId;
    if (!userId) return sendError(res, 'Unauthorized', null, 401);

    const result = await WishlistService.clearWishlist(userId);
    return sendSuccess(res, result.message, result);
  } catch (error: any) {
    return sendError(res, 'Failed to clear wishlist', error.message, 500);
  }
};
