package jnpf.franchisee.service;

import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.extension.service.IService;
import com.github.pagehelper.PageInfo;
import jnpf.model.franchisee.po.FranchiseeEntity;
import jnpf.model.franchisee.req.FranchiseeAddReq;
import jnpf.model.franchisee.req.FranchiseeQueryReq;
import jnpf.model.franchisee.req.FranchiseeUpdateReq;
import jnpf.model.franchisee.vo.FranchiseeIdName;
import jnpf.model.franchisee.vo.FranchiseePageVO;
import jnpf.model.franchisee.vo.FranchiseeVO;
import jnpf.model.franchisee.vo.FranchiseeStoreVO;
import jnpf.permission.vo.store.StoreInfoDetailVO;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.Collection;
import java.util.List;

/**
 * 加盟商服务
 */
public interface FranchiseeService extends IService<FranchiseeEntity> {

    /**
     * 新增加盟商
     *
     * @param req 新增请求参数
     */
    void add(FranchiseeAddReq req);

    /**
     * 编辑加盟商
     *
     * @param req 编辑请求参数
     */
    void update(FranchiseeUpdateReq req);

    /**
     * 删除加盟商
     *
     * @param id 主键ID
     */
    void delete(String id);

    /**
     * 查询加盟商详情
     *
     * @param id 主键ID
     * @return 加盟商详情
     */
    FranchiseeVO queryInfo(String id);

    /**
     * 分页查询加盟商列表
     *
     * @param req 查询参数
     * @return 分页结果
     */
    PageInfo<FranchiseePageVO> queryPage(FranchiseeQueryReq req,boolean includeJoinRegion);

    /**
     * 根据关键字查询加盟商ID列表（模糊匹配加盟商编码/名称/手机号）
     *
     * @param keyword 关键字（加盟商编码/加盟商名称/手机号）
     * @return 加盟商ID,Name列表
     */
    List<FranchiseeIdName> queryIdListByPrefix(String keyword);

    /**
     * 根据加盟商ID查询其下门店列表。
     *
     * @param franchiseeId 加盟商ID
     * @return 门店列表
     */
    List<FranchiseeStoreVO> queryStoreList(String franchiseeId);

    /**
     * 查询加盟商门店数量，并修正加盟商门店数量。返回查询到的门店信息
     * @param franchiseeId
     * @return
     */
    List<StoreInfoDetailVO> queryFranchiseeStoreNumAndUpdate(String franchiseeId);

    /**
     * 生成加盟商编码
     *
     * @return 加盟商编码
     */
    String generateCode();

    /**
     * 根据ID列表获取加盟商信息
     * @param ids
     * @return
     */
    List<FranchiseeIdName> getFranchiseeIdNameListByIds(Collection<String> ids);

    /**
     * 根据ID获取加盟商信息
     * @param id
     * @return
     */
    default FranchiseeIdName getFranchiseeIdNameListById(String id){
        List<FranchiseeIdName> franchiseeIdNames = getFranchiseeIdNameListByIds(List.of(id));
        if(CollectionUtil.isEmpty(franchiseeIdNames)){
            return null;
        }
        return franchiseeIdNames.get(0);
    }

    /**
     * 根据名称获取加盟商信息
     * @param name
     * @return
     */
    default List<FranchiseeIdName> getFranchiseeIdNameListByName(String name){
        return getFranchiseeIdNameListByNames(List.of(name));
    }

    /**
     * 根据名称列表获取加盟商信息
     * @param names
     * @return
     */
    List<FranchiseeIdName> getFranchiseeIdNameListByNames(Collection<String> names);

    /**
     * 根据编码获取加盟商信息
     * @param code
     * @return
     */
    default FranchiseeIdName getFranchiseeIdNameListByCode(String code){
        List<FranchiseeIdName> franchiseeIdNames = getFranchiseeIdNameListByCodes(List.of(code));
        if(CollectionUtil.isEmpty(franchiseeIdNames)){
            return null;
        }
        return franchiseeIdNames.get(0);
    }

    /**
     * 根据编码列表获取加盟商信息
     * @param codes
     * @return
     */
    List<FranchiseeIdName> getFranchiseeIdNameListByCodes(Collection<String> codes);


}
