package com.gxwebsoft.shop.service;

import com.gxwebsoft.shop.entity.ShopUserCoupon;
import com.gxwebsoft.shop.service.CouponStatusService.CouponStatusResult;
import com.gxwebsoft.shop.service.CouponStatusService.CouponValidationResult;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;

import static org.junit.jupiter.api.Assertions.*;

/**
 * 优惠券状态管理服务测试
 *
 * @author WebSoft
 * @since 2025-01-15
 */
@SpringBootTest
@ActiveProfiles("dev")
public class CouponStatusServiceTest {

    @Autowired
    private CouponStatusService couponStatusService;

    @Test
    public void testCouponStatusConstants() {
        // 测试状态常量
        assertEquals(0, ShopUserCoupon.STATUS_UNUSED);
        assertEquals(1, ShopUserCoupon.STATUS_USED);
        assertEquals(2, ShopUserCoupon.STATUS_EXPIRED);
        
        // 测试类型常量
        assertEquals(10, ShopUserCoupon.TYPE_REDUCE);
        assertEquals(20, ShopUserCoupon.TYPE_DISCOUNT);
        assertEquals(30, ShopUserCoupon.TYPE_FREE);
        
        // 测试适用范围常量
        assertEquals(10, ShopUserCoupon.APPLY_ALL);
        assertEquals(20, ShopUserCoupon.APPLY_GOODS);
        assertEquals(30, ShopUserCoupon.APPLY_CATEGORY);
    }

    @Test
    public void testCouponStatusMethods() {
        // 创建测试优惠券
        ShopUserCoupon coupon = new ShopUserCoupon();
        coupon.setStatus(ShopUserCoupon.STATUS_UNUSED);
        coupon.setEndTime(LocalDateTime.now().plusDays(7));
        
        // 测试可用状态
        assertTrue(coupon.isAvailable());
        assertFalse(coupon.isUsed());
        assertFalse(coupon.isExpired());
        assertEquals("可使用", coupon.getStatusDesc());
        
        // 测试已使用状态
        coupon.markAsUsed(123, "ORDER123");
        assertTrue(coupon.isUsed());
        assertFalse(coupon.isAvailable());
        assertEquals("已使用", coupon.getStatusDesc());
        assertEquals(Integer.valueOf(123), coupon.getOrderId());
        assertEquals("ORDER123", coupon.getOrderNo());
        
        // 测试过期状态
        coupon.setStatus(ShopUserCoupon.STATUS_UNUSED);
        coupon.setEndTime(LocalDateTime.now().minusDays(1));
        assertTrue(coupon.isExpired());
        assertFalse(coupon.isAvailable());
        assertEquals("已过期", coupon.getStatusDesc());
    }

    @Test
    public void testValidateCouponForOrder() {
        // 这个测试需要数据库中有实际的优惠券数据
        // 这里只是演示测试结构
        
        List<Integer> goodsIds = Arrays.asList(1, 2, 3);
        BigDecimal totalAmount = new BigDecimal("150.00");
        
        // 注意：这个测试需要实际的优惠券ID，在真实环境中需要先创建测试数据
        // CouponValidationResult result = couponStatusService.validateCouponForOrder(1L, totalAmount, goodsIds);
        // assertNotNull(result);
        
        System.out.println("优惠券验证测试需要实际的数据库数据");
    }

    @Test
    public void testGetUserCouponsGroupByStatus() {
        // 这个测试需要数据库中有实际的用户和优惠券数据
        // 这里只是演示测试结构
        
        // 注意：这个测试需要实际的用户ID，在真实环境中需要先创建测试数据
        // CouponStatusResult result = couponStatusService.getUserCouponsGroupByStatus(1);
        // assertNotNull(result);
        // assertTrue(result.getTotalCount() >= 0);
        
        System.out.println("用户优惠券分组测试需要实际的数据库数据");
    }

    @Test
    public void testUpdateExpiredCoupons() {
        // 测试批量更新过期优惠券
        int updatedCount = couponStatusService.updateExpiredCoupons();
        assertTrue(updatedCount >= 0);
        System.out.println("更新了 " + updatedCount + " 张过期优惠券");
    }
}
