import { delay } from './api';
import { mockCoupons } from '@/data/mockCoupons';
import type { Coupon, CouponValidationResult } from '@/types';

let coupons = [...mockCoupons];

export const couponsService = {
  list: (storeId: string) =>
    delay(coupons.filter((c) => c.storeId === storeId)),
  create: (coupon: Coupon) => {
    coupons = [coupon, ...coupons];
    return delay(coupon);
  },
  update: (id: string, patch: Partial<Coupon>) => {
    coupons = coupons.map((c) => (c.id === id ? { ...c, ...patch } : c));
    return delay(coupons.find((c) => c.id === id) ?? null);
  },
  remove: (id: string) => {
    coupons = coupons.filter((c) => c.id !== id);
    return delay({ success: true });
  },

  // POST /api/coupons/validate
  validate: (
    storeId: string,
    code: string,
    orderValue: number,
  ): Promise<CouponValidationResult> => {
    const coupon = coupons.find(
      (c) => c.storeId === storeId && c.code.toUpperCase() === code.toUpperCase(),
    );
    if (!coupon || !coupon.active) {
      return delay({ valid: false, message: 'Cupom inválido.', discount: 0 });
    }
    const now = new Date();
    if (now < new Date(coupon.startDate) || now > new Date(coupon.endDate)) {
      return delay({ valid: false, message: 'Cupom fora do período de validade.', discount: 0 });
    }
    if (coupon.usedCount >= coupon.maxUses) {
      return delay({ valid: false, message: 'Cupom esgotado.', discount: 0 });
    }
    if (orderValue < coupon.minOrderValue) {
      return delay({
        valid: false,
        message: `Pedido mínimo de R$ ${coupon.minOrderValue.toFixed(2)} para usar este cupom.`,
        discount: 0,
      });
    }
    const discount =
      coupon.discountType === 'percentual'
        ? (orderValue * coupon.discountValue) / 100
        : coupon.discountValue;
    return delay({
      valid: true,
      message: 'Cupom aplicado com sucesso!',
      discount: Math.min(discount, orderValue),
      coupon,
    });
  },
};
