package co.yixiang.yshop.module.product.service.productcoupon;

import co.yixiang.yshop.framework.common.pojo.PageResult;
import co.yixiang.yshop.module.product.controller.admin.productcoupon.vo.*;
import co.yixiang.yshop.module.product.convert.storeproductcoupon.StoreProductCouponConvert;
import co.yixiang.yshop.module.product.dal.dataobject.productcoupon.ProductCouponDO;
import co.yixiang.yshop.module.product.dal.mysql.productcoupon.ProductCouponMapper;
import co.yixiang.yshop.module.product.enums.common.PageTypeEnum;
import co.yixiang.yshop.module.product.enums.coupon.CouponExpirationEnum;
import co.yixiang.yshop.module.product.enums.coupon.CouponStatusEnum;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import jodd.util.StringUtil;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import java.time.LocalDateTime;


/**
 * 商品优惠券 Service 实现类
 *
 * @author moxiangrong
 */
@Service
@Validated
public class ProductCouponServiceImpl extends ServiceImpl<ProductCouponMapper, ProductCouponDO> implements ProductCouponService {


    @Override
    public Long createCoupon(ProductCouponCreateReqVO vo) {
        ProductCouponDO couponDO = StoreProductCouponConvert.INSTANCE.convert(vo);
        if (vo.getIds() != null && vo.getIds().length > 0) {
            couponDO.setScopeValues(convertString(vo.getIds()));
        }
        save(couponDO);
        return couponDO.getId();
    }

    @Override
    public Boolean updateCoupon(ProductCouponUpdateReqVO vo) {
        ProductCouponDO couponDO = StoreProductCouponConvert.INSTANCE.convert(vo);
        if (vo.getIds() != null && vo.getIds().length > 0) {
            couponDO.setScopeValues(convertString(vo.getIds()));
        }
        return updateById(couponDO);
    }

    @Override
    public ProductCouponDetailRespVO getCouponDetail(Long id) {
        ProductCouponDO couponDO = getById(id);
        if (StringUtil.isNotBlank(couponDO.getScopeValues())) {
            couponDO.setScopeValues(convertArr(couponDO.getScopeValues()));
        }
        ProductCouponDetailRespVO detailRespVO = StoreProductCouponConvert.INSTANCE.convert(couponDO);
        return detailRespVO;
    }

    @Override
    public PageResult<ProductCouponDetailRespVO> getStoreProductPage(StoreProductCouponPageReqVO pageReqVO) {
        PageResult<ProductCouponDetailRespVO> pageResult =
                StoreProductCouponConvert.INSTANCE.convertPage(this.baseMapper.selectPage(pageReqVO));
        pageResult.getList().forEach(res -> {
            if (CouponExpirationEnum.BY_DAY.getValue().equals(res.getExpirationType())) {
                res.setStatus(CouponStatusEnum.IN_PROGRESS.getDesc());
            } else {
                LocalDateTime now = LocalDateTime.now();
                if (now.isBefore(res.getTakingEffectTime())) {
                    res.setStatus(CouponStatusEnum.NOT_STARTED.getDesc());
                } else if (now.isAfter(res.getTakingEffectTime()) && now.isBefore(res.getExpirationTime())) {
                    res.setStatus(CouponStatusEnum.IN_PROGRESS.getDesc());
                } else {
                    res.setStatus(CouponStatusEnum.ENDED.getDesc());
                }
            }
        });
        return pageResult;
    }

    @Override
    public Boolean deleteCoupon(Long id) {
        return removeById(id);
    }

    @Override
    public PageResult<CanvasProductCouponRespVO> getCanvasProductPage(CanvasProductCouponPageReqVO pageReqVO) {
        if (PageTypeEnum.NOT_PAGE.getValue().equals(pageReqVO.getIsPage())) pageReqVO.setPageSize(Integer.MAX_VALUE);
        return StoreProductCouponConvert.INSTANCE.convertCanvasPage(this.baseMapper.getCanvasProductPage(pageReqVO));
    }

    private String convertString(String[] arr) {
        return String.join(",", arr);
    }

    private String convertArr(String value) {
        return "[" + value + "]";
    }


}
