package com.brilliance.isc.common.api.bch.service;

import com.brilliance.isc.bo.Bch;
import com.brilliance.isc.vo.manager.BchVo;

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

public interface BchService {

    // 总行
    String HEAD_BRANCH_LEVEL = "0";

    // 一级全辖
    String JURISDICTION_ONE_LEVEL = "A";

    // 二级全辖
    String JURISDICTION_TWO_LEVEL = "B";

    // 分行
    String BRANCH_LEVEL = "1";

    // 支行
    String SUB_BRANCH_LEVEL = "2";

    // 经办行
    String HANDLING_BRANCH = "1";

    // 收单行
    String ACQUIRING_BRANCH = "6";

    // 自贸区标识
    String FTA_TYPE = "X";

    String TYPE = "BCH";
    default String generatekey(String inr) {
        return TYPE + "_" + inr;
    }

    int insert(Bch record);

    int insertSelective(Bch record);

    int updateByPrimaryKeySelective(Bch record);

    int updateByPrimaryKey(Bch record);

    int deleteByPrimaryKey(Bch record);

    Bch selectByPrimaryKey(Bch record);

    List<Bch> listByUpbranch(Bch record);

    List<Bch> listByRecord(Bch record);

    List<Bch> listAllChildJurisdictionBch(String branch);

    /**
     * 根据branch查询一条BCH记录
     * @param branch 机构号
     * @return BCH记录
     */
    Bch getByBranch(String branch);

    /**
     * 根据 bchInr 查询一条BCH记录
     * @param inr BCH表主键
     * @return BCH记录
     */
    Bch getByBchInr(String inr);

    /**
     * 根据branch获取它的记账机构列表。
     * 当branch是分行（非经办、收单）、支行时，返回空；
     * 当branch是分行（经办、收单）时，返回本身；
     * 当branch是全辖时，返回其全辖下所有层级的记账机构。
     * @param branch 机构号
     * @return BCH记录集合
     */
    List<Bch> listAccBch(String branch);

    List<Bch> listAccBchAndIt(String branch);

    /**
     * 根据branch获取它的记账机构列表。
     * 当branch是分行（非经办、收单）、支行时，返回空；
     * 当branch是分行（经办、收单）时，返回本身；
     * 当branch是全辖时，返回其全辖下所有层级的记账机构。
     * @param inr BCH表主键
     * @return BCH记录集合
     */
    List<Bch> listAccBchByBchInr(String inr);

    /**
     * 根据branch获取它的默认记账机构，单条数据。
     * 需要根据登录用户当前选择的所属机构和客户的归属机构来确定记账机构
     * 当branch是总行时，返回空；
     * 当branch是非总行时，返回其默认记账机构
     * @param branch 机构号
     * @return BCH记录
     */
    Bch getDirectAccBch(String branch);

    /**
     * 根据branch获取它的默认记账机构，单条数据。
     * 当branch是总行时，返回空；
     * 当branch是非总行时，返回其默认记账机构
     * @param inr BCH表主键
     * @return BCH记录
     */
    Bch getDirectAccBchByBchInr(String inr);

    /**
     * 根据 branch 获取它可经办的所有直属下级（分行、支行），branch必须是记账机构编码，返回集合。
     * @param branch 机构号
     * @return BCH记录集合
     */
    List<Bch> listAllDirectChildSubBchByAccBch(String branch);

    /**
     * 根据 branch 获取它可经办的所有直属下级（分行、支行），branch必须是记账机构编码，返回集合。
     * @param inr BCH表主键
     * @return BCH记录集合
     */
    List<Bch> listAllDirectChildSubBchByAccBchByBchInr(String inr);

    /**
     * 根据 branch获取它可经办的所有下级（分行、支行），branch必须是记账机构编码，返回集合。
     * @param branch 机构号
     * @return BCH记录集合
     */
    List<Bch> listAllChildSubBchByAccBch(String branch);

    /**
     * 根据 branch获取它可经办的所有下级（分行、支行），branch必须是记账机构编码，返回集合。
     * @param inr BCH表主键
     * @return BCH记录集合
     */
    List<Bch> listAllChildSubBchByAccBchByBchInr(String inr);

    /**
     * 根据 branch获取它的直属上级机构（一定是全辖机构），返回单条数据。
     * @param branch 机构号
     * @return BCH记录
     */
    Bch getDirectParentBch(String branch);

    /**
     * 根据 inr 获取它的直属上级机构（一定是全辖机构），返回单条数据。
     * @param inr BCH表主键
     * @return BCH记录
     */
    Bch getDirectParentBchByBchInr(String inr);

    /**
     * 根据 branch 获取它的所有下级机构和它本身（全辖、分行、支行），返回集合。
     * @param branch 机构号
     * @return BCH记录集合
     */
    List<Bch> listAllChildAndItselfBch(String branch);

    /**
     * 根据 branch 获取它的所有下级机构和它本身（全辖、分行、支行），返回集合。
     * @param inr BCH表主键
     * @return BCH记录集合
     */
    List<Bch> listAllChildAndItselfBchByBchInr(String inr);

    /**
     * 根据 branch 获取它的所有下级机构（全辖、分行、支行），返回集合。
     * @param branch 机构号
     * @return BCH记录集合
     */
    List<Bch> listAllChildBch(String branch);

    /**
     * 根据 branch 获取它的所有下级机构（全辖、分行、支行），返回集合。
     * @param inr BCH表主键
     * @return BCH记录集合
     */
    List<Bch> listAllChildBchByBchInr(String inr);

    /**
     * 根据 branch 获取它的所有下级机构（分行、支行），返回集合
     * @param branch 机构号
     * @return BCH记录集合
     */
    List<Bch> listAllChildExcludeJurisdictionBch(String branch);

    /**
     * 根据 branch 获取它的所有下级机构（分行、支行），返回集合
     * @param inr BCH表主键
     * @return BCH记录集合
     */
    List<Bch> listAllChildExcludeJurisdictionBchByBchInr(String inr);

    /**
     * 根据branch获取它的所有下级机构（只有支行），返回集合
     * @param branch 机构号
     * @return BCH记录集合
     */
    List<Bch> listAllChildSubBch(String branch);

    /**
     * 根据branch获取它的所有下级机构（只有支行），返回集合
     * @param inr BCH表主键
     * @return BCH记录集合
     */
    List<Bch> listAllChildSubBchByBchInr(String inr);

    /**
     * 根据 branch 获取它的所有直属下级（全辖、分行、支行），返回集合。
     * @param branch 机构号
     * @return BCH记录集合
     */
    List<Bch> listAllDirectChildBch(String branch);

    /**
     * 根据 branch 获取它的所有直属下级（全辖、分行、支行），返回集合。
     * @param inr BCH表主键
     * @return BCH记录集合
     */
    List<Bch> listAllDirectChildBchByBchInr(String inr);

    /**
     * 根据branch获取它的所有直属下级（只有全辖），返回集合。
     * @param branch 机构号
     * @return BCH记录集合
     */
    List<Bch> listAllDirectChildJurisdictionBch(String branch);

    /**
     * 根据branch获取它的所有直属下级（只有全辖），返回集合。
     * @param inr BCH表主键
     * @return BCH记录集合
     */
    List<Bch> listAllDirectChildJurisdictionBchByBchInr(String inr);

    /**
     * 根据branch获取它的所有直属下级（只有分行、支行），返回集合。
     * @param branch 机构号
     * @return BCH记录集合
     */
    List<Bch> listAllDirectChildExcludeJurisdictionBch(String branch);

    /**
     * 根据branch获取它的所有直属下级（只有分行、支行），返回集合。
     * @param inr BCH表主键
     * @return BCH记录集合
     */
    List<Bch> listAllDirectChildExcludeJurisdictionBchByBchInr(String inr);

    /**
     * 根据branch获取它的所有直属下级（只有支行），返回集合。
     * @param branch 机构号
     * @return BCH记录集合
     */
    List<Bch> listAllDirectChildSubBch(String branch);

    /**
     * 根据branch获取它的所有直属下级（只有支行），返回集合。
     * @param inr BCH表主键
     * @return BCH记录集合
     */
    List<Bch> listAllDirectChildSubBchByBchInr(String inr);

    /**
     * 查询所有的分行、支行（用于返回机构列表）
     * @return BCH记录集合
     */
    List<Bch> selectAllBchList();

    /**
     * 查询所有经办机构（经办行和收单行）（用于返回机构列表）
     * @return BCH记录集合
     */
    List<Bch> selectAllAccBchList();

    /**
     * 校验是否为记账机构
     * @param branch 机构号
     * @return true - 是记账机构  false - 不是记账机构
     */
    boolean isAccBch(String branch);

    /**
     * 校验是否为记账机构
     * @param inr BCH表主键
     * @return true - 是记账机构  false - 不是记账机构
     */
    boolean isAccBchByInr(String inr);


    List<Bch> listAllBch(String branch);

    /**
     * 动态拼接SQL。不建议使用，后续可能删除
     * @param dyncMap
     * @return
     */
    @Deprecated
    List<Bch> dyncRead(Map<String,Object> dyncMap);

    /**
     * 获取所有机构及下属机构的BCH主键
     * @param branch
     * @return
     */
    List<String> listAllChildAndItselfBchInr(String branch);

    /**
     * 根据机构号、交易类型获取真正进入的交易码
     * 示例： 传入机构号3500， 交易类型GITOPN ，返回该机构真正进入的交易码是GITOPN还是GITPOP
     * @param branch
     * @param frmtyp
     * @return
     */
    String getInifrmByBranchFrm (String branch,String frmtyp);

    /**
     * 根据机构号、交易码判断是不是收单交易
     * 示例： 系统配置3500的收单交易码是GITPOP，GITPME.
     *        若传入机构号3500，交易码GITOPN ,返回false；若传入3500，GITPOP则返回true;
     * @param branch
     * @param inifrm
     * @return
     */
    boolean isSdanfrmByBranchInifrm (String branch,String inifrm);

    /**
     * 获取交易码是否是起头交易，'1'-起头， '2'-非起头
     * 示例： 传入机构号3500，交易码GITOPN， 若起头交易是GITOPN则返回'1' ，若起头交易是GITPOP则返回'2'
     * @param branch
     * @param inifrm
     * @return
     */
    String getStartFlgByBranchInifrm (String branch,String inifrm);

    /**
     * 根据URO表列出当前柜员可以查看的机构信息
     * @param userId
     * @return
     */
    List<String> selectByUroUserId(String branch,int userId) ;


    /**
     *
     * @param branch
     * @return
     */
    List<Bch> listAllByOwnExtKey(String branch);

    List<Bch> getBchcodelist(BchVo bch);

    /**
     * 是否收单行
     * @param branch
     * @return
     */
    boolean isOrderBranch(String branch);

    /**
     * 判断业务是否是否需要上收
     * @param inifrm
     * @return
     */
    boolean isOrderBranchByFrm(String inifrm);
}
