package shop.alien.store.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.multipart.MultipartRequest;
import shop.alien.entity.store.*;
import shop.alien.entity.store.dto.StoreInfoDto;
import shop.alien.entity.store.vo.*;
import shop.alien.entity.storePlatform.StoreLicenseHistory;

import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * 二期-门店信息 服务类
 *
 * @author ssk
 * @since 2024-12-05
 */
public interface StoreInfoService extends IService<StoreInfo> {

    /**
     * 门店详情
     *
     * @param id 门店id
     * @return StoreMainInfoVo
     */
    StoreMainInfoVo getDetail(Integer id);

    /**
     * 门店装修详情
     * @param id 门店id
     * @param id 门店id
     */
    StoreMainInfoVo getDecorationDetail(Integer id);

    /**
     *
     */
    List<shop.alien.entity.store.vo.StoreBusinessInfoVo>  getStoreInfoBusinessHours(Integer id);

    /**
     * 门店信息-修改后展示
     *
     * @param id 门店id
     * @return StoreMainInfoVo
     */
    StoreMainInfoVo getStoreInfo(Integer id);

    /**
     * web-分页查询店铺信息
     *
     * @param page         页码
     * @param size         页容
     * @param storeName    门店名称
     * @param storeContact 联系人
     * @param storePhone   门店电话
     * @param storeType    门店类型
     * @return IPage<StoreInfoVo>
     */
    IPage<StoreInfoVo> getStorePage(int page, int size, String storeName, String storeContact, String id, String storePhone, String storeType, String expiredState, String storeApplicationStatus, String storeStatus, String businessSection, String jingdu, String weidu, String renewContractStatus, String foodLicenceStatus, String foodLicenceWhetherExpiredStatus);

    /**
     * web-分页查询店铺信息
     *
     * @param page         页码
     * @param size         页容
     * @param storeName    门店名称
     * @param storeContact 联系人
     * @param storePhone   门店电话
     * @param storeType    门店类型
     * @return IPage<StoreInfoVo>
     */
    IPage<StoreInfoVo> getNewStorePage(int page, int size, String storeName, String storeContact, String id, String storePhone, String storeType, String expiredState, String storeApplicationStatus, String storeStatus, String businessSection, String jingdu, String weidu, String renewContractStatus, String foodLicenceStatus, String foodLicenceWhetherExpiredStatus, String startApplyTime, String endApplyTime);

    /**
     * web-重置门店密码
     *
     * @param storeId 门店id
     * @return boolean
     */
    boolean resetPassword(String storeId);

    /**
     * web-修改门店状态
     *
     * @param storeId        门店id
     * @param businessStatus 营业状态
     * @return boolean
     */
    boolean setStoreState(String storeId, Integer businessStatus);

    /**
     * web-新增店铺
     *
     * @param multipartRequest 文件请求
     * @param store            店铺信息
     * @return boolean
     */
    boolean saveStore(MultipartRequest multipartRequest, StoreInfo store);

    /**
     * 导出Excel
     *
     * @return ResponseEntity
     */
    ResponseEntity<byte[]> exportToExcel();

    /**
     * web端新增门店及门店用户
     *
     * @return ResponseEntity
     */
    StoreInfoVo saveStoreInfo(StoreInfoDto storeInfoDto) throws Exception;

    /**
     * 新增店铺草稿
     *
     * @param storeInfoDraft
     * @return
     */
    int saveStoreInfoDraft(StoreInfoDraft storeInfoDraft);

    /**
     * 查询草稿信息
     *
     * @param storeUserId
     * @return
     */
    StoreInfoDraft selectDraftByUserId(int storeUserId);

    /**
     * web端修改门店及门店用户
     *
     * @return ResponseEntity
     */
    StoreInfoVo editStoreInfo(StoreInfoDto storeInfoDto);

    /**
     * 新中台web端修改门店及门店用户
     *
     * @return ResponseEntity
     */
    StoreInfoVo editNewStoreInfo(StoreInfoDto storeInfoDto);

    /**
     * web端删除门店及门店用户
     *
     * @return ResponseEntity
     */
    String deleteStoreInfo(StoreInfoDto storeInfoDto);

    /**
     * web端删除门店及门店用户
     *
     * @return ResponseEntity
     */
    void restPassword(StoreInfoDto storeInfoDto);

    /**
     * web端查询经营板块信息
     */
    List<StoreDictionaryVo> getBusinessSection();

    /**
     * web端查询经营板块的经营种类信息
     */
    List<StoreDictionaryVo> getBusinessSectionTypes(String parentId);

    /**
     * web端查询未绑定的账号信息
     */
    List<StoreUserVo> getUnboundAccountList(String id);

    /**
     * web端新增经营板块及经营类型
     */
    void addBusinessSectionAndTypes(StoreInfoDto storeInfoDto);

    /**
     * web端查询门店明细
     */
    StoreInfoVo getStoreDetail(String storeId, String userId, String jingdu, String weidu);

    /**
     * 中台web端查询门店明细
     */
    StoreInfoVo getNewStoreDetail(String storeId);

    /**
     * web端审批结果
     */
    void approveStoreInfo(String storeId, Integer approvalStatus, String reason);

    /**
     * web端人工复核店铺
     *
     * @param storeInfoDto 复核信息（包含门店ID、复核状态、时间、原因）
     * @return true 表示保存成功
     */
    boolean manualReview(StoreInfoDto storeInfoDto);

    /**
     * web端导出商铺信息结果
     */
    String exportExcel(String id, String storePhone, String businessSection, String storeApplicationStatus) throws IOException;

    /**
     * web端导出商铺到期时间信息
     */
    String exportExcelExpirationTime(String id, String expiredState) throws IOException;

    /**
     * 保存或更新餐具费
     *
     * @param storeId 门店ID
     * @param tablewareFee 餐具费(限2位正整数)
     * @return boolean 是否成功
     */
    boolean saveOrUpdateTablewareFee(Integer storeId, Integer tablewareFee);

    /**
     * 八大类用户端筛选
     */
    IPage<StoreInfo> getScreening(ScreeningOfEightMajorCategoriesVO screeningOfEightMajorCategoriesVO);
    IPage<StoreInfoVo> getScreeningNew(ScreeningOfEightMajorCategoriesVO screeningOfEightMajorCategoriesVO);

    List<StoreInfo> getBusinessTypesName(String businessTypesNames);

    /**
     * 注销店铺
     *
     * @param storeInfo 店铺Vo
     * @return boolean
     */
    void logoutStore(StoreInfoVo storeInfo);

    /**
     * 取消注销店铺
     *
     * @param storeInfo 店铺Vo
     * @return boolean
     */
    void cancelLogoutStore(StoreInfoVo storeInfo);

    /**
     * web-查询店铺信息根据门店电话
     *
     * @param storeTel 门店电话
     * @return List<StoreInfo>
     */
    List<StoreInfo> getStoreInfoByStoreTel(String storeTel);

    /**
     * 修改店铺佣金比率
     *
     * @param storeInfoDto
     * @return
     */
    int editStoreCommissionRate(StoreInfoDto storeInfoDto);

    /**
     * 门店装修 - 编辑
     * @param storeInfo
     * @return
     */
    int saveOrUpdateStoreInfo(StoreInfoDto storeInfo);

    /**
     * 商家注销店铺效验
     */
    Map<String,String> storeInfoVerification(int id);

    /**
     * 手动删除店铺
     * @param id
     */
    void deleteManualStoreInfo(int id);

    /**
     * 店铺续签合同
     *
     */
    int uploadRenewalContract(List<StoreImg> storeImgList);

    /**
     * 店铺食品经营许可证
     * @param storeImg
     * @return
     */
    int uploadfoodLicence(StoreImg storeImg);

    /**
     * 获取店铺续签合同状态以及店铺状态为审核中合同图片list
     *
     */
    Map<String,Object> getStoreContractStatus(int id);

    /**
     * 获取店铺食品经营许可证状态以及店铺状态为审核中合同图片list
     * @param id
     * @return
     */
    Map<String,Object> getStoreFoodLicenceStatus(int id);

    int updateStoreImgModeInfo(StoreImgInfoVo storeImgInfoVo);


    /**
     * 审核通过续签合同转为正常合同删除之前合同
     *
     */
    int conversionContract(int id);

    /**
     * 经营许可证审核通过后 图片类型变为审核通过后 img_type25
     *
     */
    int foodLicenceType(int id);

    /**
     * 店铺娱乐经营许可证
     * @param storeImg
     * @return
     */
    int uploadEntertainmentLicence(StoreImg storeImg);

    /**
     * 获取店铺娱乐经营许可证状态以及店铺状态为审核中合同图片list
     * @param id
     * @return
     */
    Map<String,Object> getStoreEntertainmentLicenceStatus(int id);

    /**
     * 获取营业执照状态以及营业执照图片和到期时间
     * @param id 门店ID
     * @return
     */
    Map<String,Object> getBusinessLicenseStatus(int id);

    /**
     * 更换营业执照（上传新图片、OCR解析、记录历史、调用AI审核）
     * @param storeImg 营业执照图片信息
     * @return
     */
    int uploadBusinessLicense(StoreImg storeImg);

    /**
     * 获取营业执照变更记录列表
     * @param storeId 门店ID
     * @return
     */
    List<StoreLicenseHistory> getBusinessLicenseHistory(Integer storeId);

    /**
     * 获取其他资质证明状态以及图片列表
     * @param id 门店ID
     * @return
     */
    Map<String,Object> getOtherQualificationStatus(int id);

    /**
     * 更换其他资质证明（上传新图片、记录历史、调用AI审核，最多9张）
     * @param storeImgList 其他资质证明图片信息列表
     * @return
     */
    int uploadOtherQualification(List<StoreImg> storeImgList);

    /**
     * 获取其他资质证明变更记录列表
     * @param storeId 门店ID
     * @return
     */
    List<StoreLicenseHistory> getOtherQualificationHistory(Integer storeId);

    /**
     * 娱乐经营许可证审核通过后 图片类型变为审核通过后 img_type26
     *
     */
    int entertainmentLicenceType(int id);

    /**
     * 获取门店代金券
     */
    List<LifeCouponVo> getStoreCouponList(String storeId);


    /**
     * 获取活动banner图
     */
    List<StoreImg> getBannerUrl (String storeId);
    /**
     * 获取活动banner图
     */

    List<StoreImg> getBannerUrlInfo(String storeId, Integer businessId);


    /**
     * 更多推荐（用户端）。
     *
     * @param storeId 可选；传入且大于 0 时从推荐列表中排除该商铺（例如当前详情页）
     */
    List<StoreInfoVo> getMoreRecommendedStores(Double lon , Double lat, String businessSection, String businessTypes, String businessClassify, Integer storeId);

    /**
     * 根据店铺ID获取推荐店铺列表（用户端）
     * <p>
     * 只使用store_id查询，不包含其他筛选条件（经营板块、经营分类、分类、经纬度等）
     * </p>
     *
     * @param storeId 店铺ID，必填，必须大于0
     * @return 推荐店铺列表
     */
    List<StoreInfoVo> getRecommendedStoresByStoreId(Integer storeId);


    /**
     * 根据门店及图片地址查询最新OCR识别数据
     *
     * @param imageUrl 图片URL
     * @return OCR识别记录
     */
    Map<String, Object> getStoreOcrData(String imageUrl, String merchantName);

    /**
     * 查询四种类型店铺（酒吧、ktv、洗浴汗蒸、按摩足浴）并按距离筛选
     *
     * @param lon         经度
     * @param lat         纬度
     * @param distance    距离范围（单位：公里）
     * @param sortType    排序模式（1:智能排序，2:好评优先，3:距离优先）
     * @param businessType 店铺类型（KTV=3、洗浴汗蒸=4、按摩足浴=5，酒吧需要查询字典表），可选
     * @param categoryId  分类ID（二级或三级分类的dictId，从getAllBusinessSection接口获取），可选
     * @param storeName   店铺名称（模糊查询），可选
     * @param pageNum     页码
     * @param pageSize    页容
     * @return IPage<StoreInfoVo> 分页的门店信息列表
     */
    IPage<StoreInfoVo> getSpecialTypeStoresByDistance(Double lon, Double lat, Double distance, Integer sortType, Integer businessType, Integer categoryId, String storeName,Integer storeType, int pageNum, int pageSize);

    /**
     * web端查询门店明细
     */
    StoreInfoVo getClientStoreDetail(String storeId, String userId, String jingdu, String weidu);

    /**
     * 仅填充门店基础信息及距离相关字段（distance、distance2、subwayName、storeLocation），供预订订单详情等使用。
     * 逻辑与 getClientStoreDetail 中对应部分一致。
     *
     * @param storeId 门店ID
     * @param jingdu  经度（可选，与 weidu 同时传入时计算 distance）
     * @param weidu   纬度（可选）
     * @return StoreInfoVo 含基础门店信息及 distance/distance2/subwayName/storeLocation，无则 null
     */
    StoreInfoVo getStoreInfoVoWithDistanceFields(Integer storeId, String jingdu, String weidu);

    /**
     * 获取店铺营业状态
     * 判断店铺当前是否在营业时间内，返回营业状态和营业时间信息
     *
     * @param storeId 店铺ID
     * @return StoreBusinessStatusVo 营业状态信息
     */
    StoreBusinessStatusVo getStoreBusinessStatus(String storeId);

    /**
     * 获取休闲娱乐分类数据（主分类和子分类）
     * 返回层级结构的分类数据，包含主分类和对应的子分类
     *
     * @return List<StoreDictionaryVo> 分类列表，包含主分类和子分类
     */
    List<StoreDictionaryVo> getLeisureEntertainmentCategories();


    List<StoreDictionary> getAllBusinessSection();

    /**
     * 根据一级分类获取该分类下的二级和三级分类
     *
     * @param businessSection 一级分类的dictId（可选，如果为空则返回所有分类）
     * @return List<StoreDictionary> 分类树形结构
     */
    List<StoreDictionary> getAllBusinessSection(String businessSection);

    /**
     * 获取门店下三级分类结构
     * 根据门店ID查询该门店的经营板块、经营种类和分类的三级结构
     *
     * @param storeId 门店ID
     * @return StoreThreeLevelStructureVo 包含门店信息和三级分类树形结构
     */
    StoreThreeLevelStructureVo getStoreThreeLevelStructure(Integer storeId);

    /**
     * 你可能还喜欢（推荐店铺）
     * 根据一级分类、二级分类、三级分类进行店铺筛选
     * 筛选顺序：先三级，然后二级，最后一级
     *
     * @param businessSection 一级分类（经营板块）
     * @param businessTypes 二级分类（经营种类）
     * @param businessClassify 三级分类（分类）
     * @param lon 经度
     * @param lat 纬度
     * @return List<StoreInfoVo> 店铺信息列表
     */
    List<StoreInfoVo> getRecommendedStores(String businessSection, String businessTypes, String businessClassify, Double lon, Double lat);

    /**
     * 获取三级分类数据
     * 根据二级分类ID获取该分类下的三级分类
     *
     * @param parentId 二级分类ID
     * @return List<StoreDictionaryVo> 三级分类列表
     */
    List<StoreDictionaryVo> getBusinessClassifyData(Integer parentId);

    AiApproveStoreInfoResultVo aiApproveStoreInfo(AiApproveStoreInfo aiApproveStoreInfo);


    /**
     * 查询两种类型店铺（丽人美发、运动健身）并按距离筛选
     *
     * @param lon         经度
     * @param lat         纬度
     * @param distance    距离范围（单位：公里）
     * @param sortType    排序模式（1:智能排序，2:好评优先，3:距离优先）
     * @param businessType 店铺类型（KTV=3、洗浴汗蒸=4、按摩足浴=5，丽人美发=6，运动健身=7），可选，如果指定则只查询该类型
     * @param categoryId  字典表id，根据此id查询经营板块、经营种类、分类并匹配店铺
     * @param storeName   商家名称（模糊查询）
     * @param pageNum     页码
     * @param pageSize    页容
     * @return R<IPage<StoreInfoVo>> 分页的门店信息列表
     */
    IPage<StoreInfoVo> getLifeServicesByDistance(Double lon, Double lat, Double distance, Integer sortType, Integer businessType, Integer categoryId, String storeName, int pageNum, int pageSize);



    /**
     * 查询七种类型店铺（酒吧、ktv、洗浴汗蒸、按摩足浴 、运动健身、丽人美发 、特色美食）并按距离筛选
     *
     * @param lon         经度
     * @param lat         纬度
     * @param distance    距离范围（单位：公里）
     * @param sortType    排序模式（1:智能排序，2:好评优先，3:距离优先）
     * @param businessType 店铺类型（KTV=3、洗浴汗蒸=4、按摩足浴=5，酒吧需要查询字典表），可选
     * @param categoryId  分类ID（二级或三级分类的dictId，从getAllBusinessSection接口获取），可选
     * @param storeName   店铺名称（模糊查询），可选
     * @param pageNum     页码
     * @param pageSize    页容
     * @return IPage<StoreInfoVo> 分页的门店信息列表
     */
    IPage<StoreInfoVo> getThreeCategoriesStoresByDistance(Double lon, Double lat, Double distance, Integer sortType, Integer businessType, Integer categoryId, String storeName,Integer storeType, int pageNum, int pageSize);


    /**
     * 门店证照查询（分页）
     *
     * @param pageNum         页码
     * @param pageSize        页容
     * @param storeName       门店名称（模糊）
     * @param storeContact    联系人姓名（模糊）
     * @param storeTel        门店电话（模糊）
     * @param businessSection 经营板块
     * @param imgType         证照图片类型（14：营业执照；24/25：食品经营许可证；31/32：娱乐经营许可证）
     * @param states          证照状态
     * @param startSubmitDate 提交开始时间（yyyy-MM-dd HH:mm:ss）
     * @param endSubmitDate   提交结束时间（yyyy-MM-dd HH:mm:ss）
     * @return 证照分页结果
     */
    IPage<StoreLicenseInfoVo> getStoreLicenseList(int pageNum,
                                                  int pageSize,
                                                  String storeName,
                                                  String storeContact,
                                                  String storeTel,
                                                  String businessSection,
                                                  Integer imgType,
                                                  String states,
                                                  String startSubmitDate,
                                                  String endSubmitDate);

    /**
     * 头图上传后AI审核并更新审核状态
     *
     * @param storeImgInfoVo 图片信息VO
     * @return 审核结果 true-审核通过，false-审核不通过
     */
    boolean auditHeadImageAndUpdateStatus(StoreImgInfoVo storeImgInfoVo);

    /**
     * 更新门店头图审核状态
     *
     * @param storeId 门店ID
     * @param headImgStatus 审核状态 1-审核通过，2-审核不通过
     */
    void updateHeadImgStatus(Integer storeId, Integer headImgStatus);
    /**
     * 人工复核举报
     *
     * @param reportId 举报ID
     * @return 复核结果 true-复核通过，false-复核不通过
     */
    boolean manualReviewReport(Integer reportId, Integer type);
}
