package com.fs.live.service.impl;


import com.fs.common.core.domain.R;
import com.fs.common.core.domain.entity.SysUser;
import com.fs.common.utils.DateUtils;
import com.fs.company.domain.CompanyUser;
import com.fs.his.domain.FsStoreProduct;
import com.fs.his.mapper.FsStoreProductMapper;
import com.fs.hisStore.domain.FsStoreProductScrm;
import com.fs.hisStore.mapper.FsStoreProductScrmMapper;
import com.fs.live.domain.LiveGoods;
import com.fs.live.mapper.LiveGoodsMapper;
import com.fs.live.service.ILiveGoodsService;
import com.fs.live.vo.LiveGoodsListVo;
import com.fs.live.vo.LiveGoodsVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 直播商品Service业务层处理
 *
 * @author fs
 * @date 2025-07-08
 */
@Service
public class LiveGoodsServiceImpl  implements ILiveGoodsService {

    @Autowired
    private FsStoreProductScrmMapper fsStoreProductMapper;

    @Autowired
    private LiveGoodsMapper baseMapper;

    /**
     * 查询直播商品
     *
     * @param goodsId 直播商品主键
     * @return 直播商品
     */
    @Override
    public LiveGoods selectLiveGoodsByGoodsId(Long goodsId)
    {
        return baseMapper.selectLiveGoodsByGoodsId(goodsId);
    }

    /**
     * 查询直播商品列表
     *
     * @param liveGoods 直播商品
     * @return 直播商品
     */
    @Override
    public List<LiveGoods> selectLiveGoodsList(LiveGoods liveGoods)
    {
        return baseMapper.selectLiveGoodsList(liveGoods);
    }

    /**
     * 新增直播商品
     *
     * @param liveGoods 直播商品
     * @return 结果
     */
    @Override
    public int insertLiveGoods(LiveGoods liveGoods)
    {
        liveGoods.setCreateTime(DateUtils.getNowDate());
        return baseMapper.insertLiveGoods(liveGoods);
    }

    /**
     * 修改直播商品
     *
     * @param liveGoods 直播商品
     * @return 结果
     */
    @Override
    public R updateLiveGoods(LiveGoods liveGoods)
    {
        if(liveGoods.getGoodsId() == null ) return R.error("请选择商品");
        liveGoods.setUpdateTime(DateUtils.getNowDate());
        LiveGoods existGoods = baseMapper.selectLiveGoodsByGoodsId(liveGoods.getGoodsId());
        if (liveGoods.getStock() != null) {
            if(liveGoods.getProductId() == null) return R.error("店铺已停止售卖商品！");
            FsStoreProductScrm fsStoreProduct = fsStoreProductMapper.selectFsStoreProductById(liveGoods.getProductId());
            if(fsStoreProduct == null) return R.error("商品不存在");
            if(fsStoreProduct.getIsShow() == 0 || existGoods.getStatus() == 0) return R.error("商品已下架");
            if(fsStoreProduct.getStock() < liveGoods.getStock()) return R.error("商品库存不足");
        }
        baseMapper.updateLiveGoods(liveGoods);
        return R.ok();
    }

    /**
     * 批量删除直播商品
     *
     * @param goodsIds 需要删除的直播商品主键
     * @return 结果
     */
    @Override
    public int deleteLiveGoodsByGoodsIds(Long[] goodsIds)
    {
        return baseMapper.deleteLiveGoodsByGoodsIds(goodsIds);
    }

    /**
     * 删除直播商品信息
     *
     * @param goodsId 直播商品主键
     * @return 结果
     */
    @Override
    public int deleteLiveGoodsByGoodsId(Long goodsId)
    {
        return baseMapper.deleteLiveGoodsByGoodsId(goodsId);
    }

    @Override
    public R getStoreByLiveId(Long liveId, String key) {
        LiveGoods liveGoods = new LiveGoods();
        liveGoods.setLiveId(liveId);
        liveGoods.setKeywords(key);
        List<LiveGoodsVo> liveGoodsVos = baseMapper.selectProductListByLiveId(liveGoods);
        if (liveGoodsVos.isEmpty()) {
            return R.ok();
        }
        return R.ok().put("data", liveGoodsVos);
    }



    @Override
    public List<LiveGoodsVo> selectProductListByLiveId(LiveGoods liveGoods) {
        return baseMapper.selectProductListByLiveIdAll(liveGoods);
    }

    @Override
    public LiveGoodsVo selectLiveGoodsVoByGoodsId(Long goodsId) {
        return baseMapper.selectLiveGoodsVoByGoodsId(goodsId);
    }

    @Override
    public LiveGoodsVo showGoods(Long liveId) {
        return baseMapper.showGoods(liveId);
    }

    @Override
    public List<LiveGoods> selectByLiveId(Long existLiveId) {
        return baseMapper.selectLiveGoodsByLiveId(existLiveId);
    }

    @Override
    public void updateLiveIsShow(Long goodsId, Long liveId) {
        baseMapper.updateLiveIsShow(goodsId, liveId);
    }

    @Override
    public void updateLiveGoodsStatus(Long goodsId, Integer status) {
        baseMapper.updateLiveGoodsStatus(goodsId, status);
    }

    @Override
    public R getStoreByLiveId(Long liveId, String key, String userId) {
        LiveGoods liveGoods = new LiveGoods();
        liveGoods.setLiveId(liveId);
        liveGoods.setKeywords(key);
        liveGoods.setCompanyUserId(Long.parseLong(userId));
        List<LiveGoodsVo> liveGoodsVos = baseMapper.selectProductListByLiveId(liveGoods);
        if (liveGoodsVos.isEmpty()) {
            return R.ok();
        }
        return R.ok().put("data", liveGoodsVos);
    }

    /**
     * 批量新增直播商品
     *
     * @param payload 包含 直播间和商品信息ids
     * @return 结果
     */
    @Override
    public R insertLiveGoods(Map<String, Object> payload, CompanyUser user) {
        Long liveId = Long.valueOf((String) payload.get("liveId"));
        String productsId = (String) payload.get("productsId");
        List<String> productIdList = new ArrayList<>(Arrays.asList(productsId.split(",")));
        if (productIdList.isEmpty()) {
            return R.error("请选择商品");
        }
        List<LiveGoods> existGoods = baseMapper.selectLiveGoodsByLiveId(liveId);
        List<Long> existProductIdList = existGoods.stream().map(LiveGoods::getProductId).collect(Collectors.toList());
        productIdList.removeAll(existProductIdList);
        if (productIdList.isEmpty()) {
            return R.ok("已添加");
        }
        List<Long> productIdsLong = productIdList.stream().map(Long::parseLong).collect(Collectors.toList());
        //  查询商品信息列表（假设返回 List<StoreProduct>）
        List<FsStoreProductScrm> productInfoList = fsStoreProductMapper.selectFsStoreProductByProductIds(productIdsLong);

        //  转换为 LiveGoods 并批量插入
        List<LiveGoods> liveGoodsList = productInfoList.stream()
                .map(product -> {
                    LiveGoods liveGoods = new LiveGoods();
                    liveGoods.setLiveId(liveId);
                    liveGoods.setCompanyId(user.getCompanyId());
                    liveGoods.setCompanyUserId(user.getUserId());
                    liveGoods.setProductId(product.getProductId());
                    liveGoods.setStatus(1);
                    liveGoods.setIsShow(false);
                    liveGoods.setSales(Math.toIntExact(product.getSales()));
                    liveGoods.setStock(product.getStock());
                    liveGoods.setSort(product.getSort());
                    liveGoods.setCreateTime(DateUtils.getNowDate());
                    liveGoods.setCreateBy(String.valueOf(user.getUserId()));
                    return liveGoods;
                })
                .collect(Collectors.toList());
//
//        // 批量插入
        baseMapper.insertLiveGoodsList(liveGoodsList);
        return R.ok();
    }

    @Override
    public int insertLiveGoodsAdmin(Map<String, Object> payload, SysUser user) {
        Long liveId = Long.valueOf((String) payload.get("liveId"));
        String productsId = (String) payload.get("productsId");
        List<String> productIdList = new ArrayList<>(Arrays.asList(productsId.split(",")));
        if (productIdList.isEmpty()) {
            return 0;
        }
        List<LiveGoods> existGoods = baseMapper.selectLiveGoodsByLiveId(liveId);
        List<String> existProductIdList = existGoods.stream().map(LiveGoods::getProductId).map(String::valueOf).collect(Collectors.toList());
        productIdList.removeAll(existProductIdList);
        if (productIdList.isEmpty()) {
            return 0;
        }
        List<Long> productIdsLong = productIdList.stream().map(Long::parseLong).collect(Collectors.toList());
        //  查询商品信息列表（假设返回 List<StoreProduct>）
        List<FsStoreProductScrm> productInfoList = fsStoreProductMapper.selectFsStoreProductByProductIds(productIdsLong);

        //  转换为 LiveGoods 并批量插入
        List<LiveGoods> liveGoodsList = productInfoList.stream()
                .map(product -> {
                    LiveGoods liveGoods = new LiveGoods();
                    liveGoods.setLiveId(liveId);
                    liveGoods.setProductId(product.getProductId());
                    liveGoods.setStatus(1);
                    liveGoods.setStock(Long.valueOf(product.getStock()));
                    liveGoods.setSales(Math.toIntExact(product.getSales()));
                    liveGoods.setSort(product.getSort());
                    liveGoods.setCreateTime(DateUtils.getNowDate());
                    liveGoods.setCreateBy(String.valueOf(user.getUserId()));
                    liveGoods.setIsShow(false);
                    return liveGoods;
                })
                .collect(Collectors.toList());
//
//        // 批量插入
        return baseMapper.insertLiveGoodsList(liveGoodsList);
    }

    @Override
    public R handleShelfOrUn(LiveGoodsListVo listVo) {
        int updatedCount = baseMapper.updateBatchList(listVo);
        if (updatedCount > 0) {
            return R.ok("操作成功");
        }
        return R.error();
    }

    @Override
    public R handleDeleteSelected(LiveGoodsListVo listVo) {
        int deleteCount = baseMapper.deleteBatchList(listVo);
        if (deleteCount > 0) {
            return R.ok("操作成功");
        }
        return R.error();
    }

    /**
     * 根据店铺ID查询商品列表
     */
    @Override
    public List<LiveGoodsVo> selectLiveGoodsListByMap(Map<String, Object> params) {
        return baseMapper.selectLiveGoodsListByStoreId(params);
    }

    @Override
    public Long getStoreIdByLiveId(Long liveId) {
        return baseMapper.getStoreIdByLiveId(liveId);
    }



    @Override
    public R handleShelfOrUnAdmin(LiveGoodsListVo listVo) {
        baseMapper.handleShelfOrUnAdmin(listVo);
        return R.ok();
    }

    @Override
    public R handleDeleteSelectedAdmin(LiveGoodsListVo listVo) {
        baseMapper.handleDeleteSelectedAdmin(listVo);
        return R.ok();
    }

    @Override
    public R handleIsShowChange(LiveGoodsListVo listVo) {
        if (listVo.getGoodsIds().isEmpty()) {
            return R.error("请选择商品");
        }
        if (listVo.getIsShow()) {
            int count = baseMapper.selectIsShowDTO(listVo.getLiveId());
            if (count > 0 || listVo.getGoodsIds().size() > 1) {
                return R.ok("目前仅支持单一物品展示").put("isShow", !listVo.getIsShow());
            }
        }
        baseMapper.handleIsShowChange(listVo);
        return R.ok().put("isShow", listVo.getIsShow());
    }
}
