package com.cool.store.mapper;

import com.cool.store.dto.store.StoreAddressDTO;
import com.cool.store.dto.store.StoreAreaDTO;
import com.cool.store.dto.store.StoreOrderTimeDTO;
import com.cool.store.entity.StoreDO;
import com.cool.store.response.MiniShopsResponse;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Date;
import java.util.List;
import java.util.Map;

@Mapper
public interface StoreMapper {

    StoreDO getByStoreId(@Param("storeId") String storeId);

    StoreDO getEffectiveByStoreId(@Param("storeId") String storeId);

    List<StoreDO> getEffectiveStoreByStoreIds(@Param("storeIds") List<String> storeIds);

    List<StoreDO> getStoreByStoreIds(@Param("storeIds") List<String> storeIds);
    /**
     * 根据区域Id查询所有门店(包含所有区域子节点)
     * @param regionId
     * @return
     */
    List<StoreDO> listStoreByRegionId(@Param("regionId") String regionId);


    List<String> getStoreNumByStoreIds(@Param("storeIds") List<String> storeIds);

    StoreDO getByStoreNum(@Param("storeNum") String storeNum);

    /**
     * 查询自定义字段含有该手机号的门店
     * @param mobile
     * @return
     */
    List<StoreDO> listByMobile(@Param("mobile") String mobile);

    List<MiniShopsResponse> getSubStoreByRegionIdsAndMobile(@Param("regionIdList") List<String> regionIdList, @Param("mobile") String mobile,
                                                            @Param("storeName") String storeName, @Param("storeNum") String storeNum);
    /**
     * 分页查询门店数据
     * @return
     */
    List<StoreDO> list(@Param("isIot") Integer isIot);

    List<StoreAreaDTO> getStoreAreaList( @Param("storeIds") List<String> storeIds);

    List<StoreDO> getStoreNumByStoreCodes(@Param("storeCodeIds") List<String> storeCodeIds);

    List<StoreAreaDTO> listStoreByRegionPathList(@Param("regionPathList") List<String> regionPathList);

    /**
     * 批量新增或编辑最新订货时间
     * @param dtoList 门店最新订货时间DTO列表
     * @return int
     */
    int batchInsertOrUpdateOrderTime(@Param("dtoList") List<StoreOrderTimeDTO> dtoList);

    /**
     * 查询所有门店id和门店编码
     */
    List<StoreDO> getAllStoreIdAndNum(@Param("storeStatus") List<String> storeStatus);

    /**
     * 查询门店积分
     * @param storeId 门店id
     * @return 积分
     */
    BigDecimal getStoreScore(@Param("storeId") String storeId);

    /**
     * 根据门店id查询门店编码
     * @param storeIds 门店id列表
     * @return store_id -> score
     */
    List<Map<String, Object>> getScoreByStoreIds(@Param("storeIds") List<String> storeIds);

    /**
     * 更新门店积分
     * @param storeId 门店id
     * @param score 积分
     */
    int updateStoreScore(String storeId, BigDecimal score);
    /**
     * 修改门店营业状态
     * @param storeId 门店id
     * @param storeStatus 门店营业状态
     */
    void updateStoreStatus(@Param("storeId") String storeId,
                           @Param("storeStatus") String storeStatus,
                           @Param("actualOpenDate") Date actualOpenDate);

    int updateStatus(@Param("storeId") String storeId,
                     @Param("storeStatus") String storeStatus);

    /**
     * 门店状态改为闭店
     * @param storeId 门店id
     */
    int closeStore(@Param("storeId") String storeId, @Param("actualCloseData") Date actualCloseData);

    /**
     * 新增或编辑闭店信息
     * @param storeId 门店id
     * @param closeReason 闭店原因
     * @param closeNature 闭店性质
     * @return int
     */
    int insertOrUpdateCloseInfo(@Param("storeId") String storeId, @Param("closeReason") Integer closeReason, @Param("closeNature") Integer closeNature);

    int insertOrUpdateCloseUpReason(@Param("storeId") String storeId, @Param("closeUpReason") String closeUpReason);

    /**
     * 查询最近没有订货记录的门店
     * @param latestDate 最近订货时间
     * @param businessTypes 商圈类型
     * @param inBusinessType 在列表内
     * @return 门店列表
     */
    List<StoreDO> getNoOrderStore(@Param("latestDate") LocalDate latestDate, @Param("businessTypes") List<String> businessTypes, @Param("inBusinessType") Boolean inBusinessType);

    /**
     * 根据市统计门店数量
     * @param cityNames 市列表
     */
    List<Map<String, Object>> storeNumStatisticsByAd(@Param("years") List<Integer> years,
                                                     @Param("cityNames") List<String> cityNames);

    /**
     * 根据省市统计开店数量
     * @param province 省
     * @param city 市
     * @param openStartTime 开店开始时间
     * @param openEndTime 开店结束时间
     * @return 数量
     */
    Integer totalStoreNumByAd(@Param("province") String province,
                              @Param("city") String city,
                              @Param("openStartTime") LocalDate openStartTime,
                              @Param("openEndTime") LocalDate openEndTime);

    /**
     * 根据区域id查询门店列表
     * @param regionIds 区域id
     * @param keyword 门店名称或门店编码
     * @return 门店列表
     */
    List<StoreDO> getStoreByRegionIds(@Param("regionIds") List<String> regionIds, @Param("keyword") String keyword);

    List<StoreAddressDTO> getStoreAddress(@Param("flag") Integer flag, @Param("storeCode") String storeCode);

    int batchUpdateAddress(@Param("list") List<StoreDO> storeList);

    String getPrivateSphereQrCode(@Param("storeId") String storeId);
}
