package com.ylx.massage.service;

import java.util.List;
import java.util.Map;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ylx.common.core.domain.model.LoginUser;
import com.ylx.massage.domain.MaProject;
import com.ylx.massage.domain.MaTechnician;
import com.ylx.massage.domain.dto.*;
import com.ylx.massage.domain.vo.*;
import com.ylx.massage.domain.dto.MaProjectSaveDto;
import com.ylx.massage.domain.dto.MaTechnicianAuditQueryDTO;
import com.ylx.massage.domain.dto.MaTechnicianAuditSubmitDTO;
import com.ylx.home.category.domain.dto.MerchantRecommendDto;
import com.ylx.massage.domain.dto.MaTechnicianMerchantAddDTO;
import com.ylx.massage.domain.dto.MaTechnicianMerchantQueryDTO;
import com.ylx.massage.domain.dto.MaTechnicianPendingAuditSubmitDTO;
import com.ylx.massage.domain.vo.MaTechnicianAppAddVo;
import com.ylx.massage.domain.vo.MaTechnicianAuditListVO;
import com.ylx.massage.domain.vo.MaTechnicianCertificateVO;
import com.ylx.massage.domain.vo.MaTechnicianMerchantDetailVO;
import com.ylx.massage.domain.vo.MaTechnicianMerchantListVO;
import com.ylx.massage.domain.vo.MerchantVo;
import com.ylx.merchant.domain.dto.MerchantDetailDTO;
import com.ylx.merchant.domain.dto.MerchantListDTO;
import com.ylx.merchant.domain.dto.MerchantProjectDTO;
import com.ylx.merchant.domain.vo.MerchantDetailVO;
import com.ylx.merchant.domain.vo.MerchantListVO;
import com.ylx.merchant.domain.vo.MerchantWithAddressVO;
import com.ylx.project.domain.Project;
import com.ylx.project.domain.bookMerchant.vo.ProjectInfoVO;

/**
 * 技师Service接口
 *
 * @author ylx
 * @date 2024-03-22
 */
public interface IMaTechnicianService extends IService<MaTechnician> {
    /**
     * 查询技师
     *
     * @param id 技师主键
     * @return 技师
     */
    public MaTechnician selectMaTechnicianById(Long id);

    /**
     * 查询技师列表
     *
     * @param maTechnician 技师
     * @return 技师集合
     */
    public List<MaTechnician> selectMaTechnicianList(MaTechnician maTechnician);

    /**
     * 新增技师
     *
     * @param
     * @return 结果
     */
    public int insertMaTechnician(MaTechnicianAppAddVo maTechnicianAppAddVo);

    /**
     * 后台新增商户
     *
     * @param dto       新增商户参数
     * @param loginUser 当前登录用户
     * @return 结果
     */
    public int insertMerchant(MaTechnicianMerchantAddDTO dto, LoginUser loginUser);

    /**
     * 后台编辑商户
     *
     * @param id        商户ID
     * @param dto       编辑商户参数
     * @param loginUser 当前登录用户
     * @return 结果
     */
    public int updateMerchant(Integer id, MaTechnicianMerchantAddDTO dto, LoginUser loginUser);

    /**
     * 后台变更商户管理状态
     *
     * @param id        商户ID
     * @param dto       状态变更参数
     * @param loginUser 当前登录用户
     * @return 结果
     */
    int changeMerchantStatus(Integer id, MaTechnicianStatusChangeDTO dto, LoginUser loginUser);

    /**
     * 后台上传商户合同文件
     *
     * @param id        商户ID
     * @param file      合同文件
     * @param loginUser 当前登录用户
     * @return 上传结果
     */
    Integer uploadMerchantContract(Integer id, Map<String, Object> file, LoginUser loginUser);

    /**
     * 后台查询商户入驻审核列表
     *
     * @param page 分页参数
     * @param dto  查询条件
     * @return 商户入驻审核分页列表
     */
    Page<MaTechnicianAuditListVO> selectMerchantAuditList(Page<MaTechnicianAuditListVO> page, MaTechnicianAuditQueryDTO dto);

    /**
     * 商户待入驻提交审核。
     *
     * @param id        商户ID
     * @param loginUser 当前登录用户
     * @return 结果
     */
    int submitMerchantAudit(Integer id, MaTechnicianAuditSubmitDTO dto, LoginUser loginUser);

    /**
     * 后台待审核页面审核通过商户。
     *
     * @param id        商户ID
     * @param dto       待审核通过参数
     * @param loginUser 当前登录用户
     * @return 结果
     */
    int approvePendingMerchantAudit(Integer id, MaTechnicianPendingAuditSubmitDTO dto, LoginUser loginUser);

    /**
     * 后台查询商户列表
     *
     * @param page 分页参数
     * @param dto  查询条件
     * @return 商户分页列表
     */
    public Page<MaTechnicianMerchantListVO> selectMerchantList(Page<MaTechnicianMerchantListVO> page,
                                                               MaTechnicianMerchantQueryDTO dto);

    /**
     * 后台查询商户详情
     *
     * @param id 商户ID
     * @return 商户详情
     */
    public MaTechnicianMerchantDetailVO selectMerchantDetail(Long id);

    /**
     * 后台查询商户证照
     *
     * @param id 商户ID
     * @return 商户证照
     */
    MaTechnicianCertificateVO selectMerchantCertificate(Integer id);

    /**
     * 修改技师
     *
     * @param
     * @return 结果
     */
    public int updateMaTechnician(MaTechnicianAppAddVo maTechnicianAppAddVo);

    /**
     * 批量删除技师
     *
     * @param ids 需要删除的技师主键集合
     * @return 结果
     */
    public int deleteMaTechnicianByIds(Long[] ids);

    /**
     * 删除技师信息
     *
     * @param id 技师主键
     * @return 结果
     */
    public int deleteMaTechnicianById(Long id);

    /**
     * 首页选中的城市是否有开通服务
     *
     * @param areaCode
     * @return
     */
    Boolean isHasMerchantCity(String areaCode);

    List<MerchantVo> getMerchantRecommend(MerchantRecommendDto dto);

    /**
     * 申请技师
     *
     * @param req
     */
    void apply(MaTechnicianAppAddVo req);

    /**
     * 申请技师文件
     *
     * @param req
     */
    void applyFile(MerchantApplyFileRequestDto req);

    /**
     * 修改商户资料。
     * 基础信息仅允许修改昵称和简介，入驻资料文件按文件类型新增或更新。
     *
     * @param req 修改参数
     */
    void updateTechnician(MerchantApplyFileRequestDto req);

    /**
     * 获取商户资料。
     *
     * @param openid
     * @return MerchantProfileVO
     */
    MerchantProfileVO getMerchantProfile(String openid);

    void submitMerchantProfile(MerchantProfileSubmitDTO dto);

    /**
     * 商户申请入驻审核
     *
     * @param merchantId
     * @param dto
     * @param loginUser
     * @return int
     */
    int auditMerchantProfile(Integer merchantId, MerchantProfileAuditDTO dto, LoginUser loginUser);

    /**
     * 技师状态切换
     *
     * @param
     */
    Result switchToOffline(Long userId, Boolean forceConfirm);

    /**
     * 技师待处理订单列表
     *
     * @param query
     * @return
     */
    List<WaitOrderDTO> listWaitOrder(WaitOrderQueryDTO query);

    /**
     * 接单
     *
     * @param req
     * @return
     */
    String acceptOrder(AcceptOrderReqDTO req);
    /**
     * 技师接单确认接单
     *
     * @param techId
     * @param orderId
     * @return
     */
    String confirmRestAccept(Long techId, Long orderId);
    /**
     * 技师拒绝接单
     *
     * @param req
     * @return
     */
    void refuseOrder(RefuseOrderReqDTO req);
    /**
     * 技师列表
     *
     * @param userId
     * @param auditStatus
     * @return
     */
    List<MaProject> selectMaTechnicianListBy(Integer merchantId, Integer auditStatus);

    /**
     * 服务项目列表
     *
     * @param typeId
     * @return
     */
    List<Project> selectTechnicianListBy(String typeId);

    /**
     * 技师未申请项目列表
     *
     * @param userId
     * @param typeId
     * @return
     */
    List<Project> getNotApplyList(Integer merchantId, Integer serviceTag);

    /**
     * 申请开通新服务
     *
     * @param dto
     * @return
     */
    int applyForService(MaProjectSaveDto dto);

    /**
     * 根据微信openid查询商户信息和入驻资料。
     *
     * @param openid 微信openid
     * @return 商户信息和入驻资料附件
     */
    MerchantAuditFile getTechnicianInfo(String openid);

    /**
     * 商户入驻信息
     *
     * @param userId 商户ID
     * @return 商户信息和入驻资料附件
     */
    MerchantAuditFile getTechnicianList(Integer userId);

    /**
     * 查询商户合同记录信息
     *
     * @param userId
     * @return ContractRecordVO
     */
    ContractRecordVO getContractRecords(Long userId);

    Page<MerchantListVO> getMerchantPage(MerchantListDTO dto);

    Page<ProjectInfoVO> getByMerchantProject(MerchantProjectDTO dto);

    MerchantDetailVO getDetail(MerchantDetailDTO dto);

    Long countValidTech();

    List<MerchantWithAddressVO> selectTechWithAddressByIds(List<Integer> techIds);

    List<MerchantWithAddressVO> listValidTechWithAddress(long offset, long fetchCount);

    List<MaTechnician> selectAllValidTech();

    Page<MerchantListVO> homeSearchPage(MerchantListDTO dto);
}
