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

// Get or Create User Shopping Cart
export const getCart = async (req: AuthenticatedRequest, res: Response) => {
  try {
    const userId = req.user?.userId;
    if (!userId) return sendError(res, 'User ID missing', null, 401);

    let cart = await prisma.shoppingCart.findUnique({
      where: { userId },
      include: {
        items: {
          include: {
            variant: true,
            book: {
              include: {
                bookAuthors: { include: { author: true } },
                variants: { where: { isActive: true } },
              },
            },
          },
        },
      },
    });

    if (!cart) {
      cart = await prisma.shoppingCart.create({
        data: { userId },
        include: {
          items: {
            include: {
              variant: true,
              book: {
                include: {
                  bookAuthors: { include: { author: true } },
                  variants: { where: { isActive: true } },
                },
              },
            },
          },
        },
      });
    }

    return sendSuccess(res, 'User cart retrieved', cart);
  } catch (error: any) {
    return sendError(res, 'Error fetching cart', error.message, 500);
  }
};

// Add / Sync Item to User Cart
export const syncCartItem = async (req: AuthenticatedRequest, res: Response) => {
  try {
    const userId = req.user?.userId;
    const { bookId, variantId, quantity } = req.body;

    if (!userId) return sendError(res, 'Unauthorized', null, 401);

    let cart = await prisma.shoppingCart.findUnique({ where: { userId } });
    if (!cart) {
      cart = await prisma.shoppingCart.create({ data: { userId } });
    }

    const existingItem = await prisma.cartItem.findFirst({
      where: {
        cartId: cart.id,
        bookId,
        ...(variantId ? { variantId } : { variantId: null }),
      },
    });

    if (quantity <= 0) {
      if (existingItem) {
        await prisma.cartItem.delete({ where: { id: existingItem.id } });
      }
      return sendSuccess(res, 'Item removed from cart');
    }

    if (existingItem) {
      await prisma.cartItem.update({
        where: { id: existingItem.id },
        data: { quantity: Number(quantity) },
      });
    } else {
      await prisma.cartItem.create({
        data: {
          cartId: cart.id,
          bookId,
          variantId: variantId || null,
          quantity: Number(quantity),
        },
      });
    }

    return sendSuccess(res, 'Cart item synced successfully');
  } catch (error: any) {
    return sendError(res, 'Failed to sync cart item', error.message, 500);
  }
};

// Validate Coupon Code
export const validateCoupon = async (req: AuthenticatedRequest, res: Response) => {
  try {
    const { code, subtotal } = req.body;

    const coupon = await prisma.coupon.findUnique({
      where: { code: String(code).toUpperCase() },
    });

    if (!coupon || !coupon.isActive || coupon.expiresAt < new Date()) {
      return sendError(res, 'Invalid or expired coupon code', null, 400);
    }

    if (coupon.minOrderValue && Number(subtotal) < Number(coupon.minOrderValue)) {
      return sendError(
        res,
        `Minimum order value of ₹${coupon.minOrderValue} required for coupon '${code}'`,
        null,
        400
      );
    }

    return sendSuccess(res, 'Coupon code applied successfully!', {
      code: coupon.code,
      discountType: coupon.discountType,
      discountValue: Number(coupon.discountValue),
    });
  } catch (error: any) {
    return sendError(res, 'Coupon validation failed', error.message, 500);
  }
};
