package com.ylx.massage.mapper;

import java.util.List;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ylx.companion.domain.dto.CompanionRecommendDTO;
import com.ylx.companion.domain.vo.HotCompanionMerchantVO;
import com.ylx.massage.domain.MaTechnician;
import com.ylx.massage.domain.dto.MaTechnicianAuditQueryDTO;
import com.ylx.massage.domain.dto.MaTechnicianMerchantQueryDTO;
import com.ylx.home.category.domain.dto.MerchantRecommendDto;
import com.ylx.massage.domain.vo.MaTechnicianAuditListVO;
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.bookMerchant.vo.ProjectInfoVO;
import org.apache.ibatis.annotations.Param;
import org.mapstruct.Mapper;

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

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

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

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

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

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

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

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

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

    /**
     * 根据商户ID查询商户。
     *
     * @param id 商户ID
     * @return 商户信息
     */
    default MaTechnician selectMerchantById(Integer id) {
        return selectById(id);
    }

    /**
     * 根据商户ID查询商户证照。
     *
     * @param id 商户ID
     * @return 商户信息
     */
    default MaTechnician selectMerchantCertificateById(Integer id) {
        return selectById(id);
    }

    /**
     * 根据商户ID查询商户。
     *
     * @param id 商户ID
     * @return 商户信息
     */
    default MaTechnician selectMerchantById(Long id) {
        return selectById(id);
    }

    /**
     * 根据商户ID更新商户。
     *
     * @param maTechnician 商户信息
     * @return 影响行数
     */
    default int updateMerchantById(MaTechnician maTechnician) {
        return updateById(maTechnician);
    }

    /**
     * 根据商户ID更新商户管理状态和变更原因。
     *
     * @param maTechnician 商户状态变更信息
     * @return 影响行数
     */
    default int updateMerchantStatusById(MaTechnician maTechnician) {
        return updateById(maTechnician);
    }

    /**
     * 根据商户ID更新合同文件。
     *
     * @param maTechnician 商户合同文件信息
     * @return 影响行数
     */
    default int updateMerchantContractById(MaTechnician maTechnician) {
        return updateById(maTechnician);
    }

    /**
     * 根据商户ID提交待入驻审核。
     *
     * @param maTechnician 商户审核状态信息
     * @return 影响行数
     */
    default int submitMerchantAuditById(MaTechnician maTechnician) {
        return updateById(maTechnician);
    }

    /**
     * 根据商户ID审核通过待审核商户。
     *
     * @param maTechnician 商户审核信息
     * @return 影响行数
     */
    default int approvePendingMerchantAuditById(MaTechnician maTechnician) {
        return updateById(maTechnician);
    }

    List<MerchantVo> getMerchantRecommend(@Param("dto") MerchantRecommendDto dto);

    /**
     * 查询该城市是否有商户提供服务
     *
     * @param areaCode
     * @return Boolean
     */
    Boolean isHasMerchantCity(@Param("areaCode") String areaCode);

    /**
     * 首页陪玩热门商户推荐销量前五
     *
     * @param dto
     * @return
     */
    List<HotCompanionMerchantVO> getHotCompanionMerchantList(@Param("dto") CompanionRecommendDTO dto);

    Page<MerchantListVO> getMerchantPage(Page<MerchantListVO> page, @Param("dto") MerchantListDTO dto);

    Page<ProjectInfoVO> getByMerchantProject(Page<ProjectInfoVO> page, @Param("dto") MerchantProjectDTO dto);

    MerchantDetailVO getDetailById(Integer id);

    MerchantDetailVO getDetail(@Param("dto") MerchantDetailDTO dto);

    Long countValidTech();

    List<MerchantWithAddressVO> selectTechWithAddressByIds(@Param("ids") List<Integer> ids);

    List<MerchantWithAddressVO> listValidTechWithAddress(@Param("offset") long offset, @Param("size") long fetchCount);

    /**
     * 查询全部有效技师（未删除、正常、审核通过、非休息）
     */
    List<MaTechnician> selectAllValidTech();
}

