package com.yn.bftl.thirdparty.modules.contract.service;

import com.qiyuesuo.sdk.v2.bean.Contract;
import com.qiyuesuo.sdk.v2.response.CompanyAuthResult;
import com.yn.bftl.common.modules.company.entity.ContractLock;
import com.yn.bftl.thirdparty.modules.contract.dto.CompanyAuthWithlicenseDTO;
import com.yn.bftl.thirdparty.modules.contract.dto.ContractLockCreateEmployeeDTO;
import com.yn.bftl.thirdparty.modules.contract.dto.ContractLockInviteSubCompanyDTO;
import com.yn.bftl.thirdparty.modules.contract.dto.ContractLockUpdateEmployeeDTO;
import com.yn.bftl.thirdparty.modules.contract.vo.CallVo;
import com.yn.bftl.thirdparty.modules.contract.vo.LinkVo;
import com.yn.bftl.thirdparty.modules.contract.vo.LoadInfo;
import com.yn.bftl.thirdparty.modules.contract.vo.StatusVo;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * $ContractLockService契约锁业务处理接口
 *
 * @author chendehuihuo
 * @date 2022/7/20 11:29
 */
public interface ContractLockService {

    /**
     * 获取企业认证链接
     *
     * @param
     * @return
     * @author chendehuihuo
     * @date 2022-07-20 14:51
     */
    LinkVo getCompanyAuthLink();

    /**
     * 获取企业认证连接（带营业执照）
     *
     * @param dto
     * @return
     * @author chendehuihuo
     * @date 2022-07-20 14:51
     */
    LinkVo getCompanyAuth2Link(CompanyAuthWithlicenseDTO dto);

    /**
     * 查询企业认证状态
     *
     * @param
     * @return
     * @author chendehuihuo
     * @date 2022-07-20 14:51
     */
    StatusVo getCompanyAuthStatus();

    /**
     * 处理企业认证结果
     *
     * @param companyId
     * @param contractLockId
     * @param result
     */
    void handleCompanyAuthResult(Long companyId, Long contractLockId, CompanyAuthResult result);

    /**
     * 获取合同【预签署页面、签署页面】
     *
     * @param itemId  合同明细ID
     * @param isLogin 是否登录，不登录默认甲方访问
     * @return
     * @author chendehuihuo
     * @date 2022-07-20 16:12
     */
    LinkVo show(Long itemId, Boolean isLogin);

    /**
     * 获取合同明细
     *
     * @param itemId 合同明细ID
     * @return
     * @author chendehuihuo
     * @date 2022-07-20 16:12
     */
    Contract getDetails(Long itemId);

    /**
     * 创建合同草稿
     *
     * @param loadInfo 基础信息
     * @return
     * @author chendehuihuo
     * @date 2022-07-20 16:12
     */
    String createDraft(LoadInfo loadInfo);

    /**
     * 用模板添加合同文档
     *
     * @param
     * @return
     * @author chendehuihuo
     * @date 2022-07-20 16:26
     */
    Object addByTemplate(LoadInfo loadInfo);

    /**
     * 发起合同
     *
     * @param itemId  合同明细ID
     * @param isLogin 是否登录，不登录默认甲方访问
     */
    void send(Long itemId, Boolean isLogin);

    /**
     * 预签署页面
     *
     * @param contractId
     * @return
     */
    String appointUrl(String contractId);

    /**
     * 签署页面
     *
     * @param contractId
     * @param contractType
     * @param contact
     * @return
     * @author chendehuihuo
     * @date 2022-07-20 16:30
     */
    String pageUrl(String contractId, String contractType, String contact);

    /**
     * 契约锁合同回调处理
     *
     * @param request
     * @return
     * @author chendehuihuo
     * @date 2022-07-26 17:53
     */
    String callBack(String signature, String timestamp, HttpServletRequest request);

    /**
     * 契约锁企业认证回调处理
     *
     * @param status
     * @param actionEvent
     * @param requestId
     * @param authInfo
     * @return
     * @author chendehuihuo
     * @date 2022-07-27 11:27
     */
    CallVo companyCallback(Integer status, Integer actionEvent, String requestId, String authInfo);

    /**
     * 获取合同详情url
     *
     * @param id
     * @return
     */
    String getDetailUrl(Long id);

    /**
     * 获取契约锁合同详情url
     *
     * @param contractId
     * @return
     */
    String detailUrl(Long contractId);

    /**
     * 生成契约锁收据合同并盖章
     */
    void generateReceipt();

    /**
     * 作废合同
     *
     * @param contractId
     * @param invalidReason
     * @return
     */
    boolean invalid(Long contractId, String invalidReason);

    /**
     * 企业认证重新回到第一步
     *
     * @param companyId
     */
    void anew(Long companyId);

    /**
     * 修改认证中的企业名称、社会信用代码
     *
     * @param companyId
     * @param name
     * @param code
     * @param legalPerson
     * @param authentication
     */
    void update(Long companyId, String name, String code, String legalPerson, Boolean authentication);

    /**
     * 获取认证中的信息
     *
     * @param companyId
     * @return
     */
    ContractLock contractLock(Long companyId);

    /**
     * 下载合同文档
     *
     * @param documentId
     * @param response
     * @return
     * @author chendehuihuo
     * @date 2022-07-22 14:58
     */
    void download(Long documentId, HttpServletResponse response);

    /**
     * 下载合同与附属文件
     *
     * @param contractId
     * @param response
     */
    void downloadZip(Long contractId, HttpServletResponse response);

    /**
     * 对账单
     *
     * @param id
     * @return
     */
    String statement(Long id);

    /**
     * 契约锁-企业邀请回调
     *
     * @param inviteId    邀请ID
     * @param result      是否通过，AGREE（“通过”）、REJECT（“拒绝”）
     * @param companyName 邀请的子公司名称
     * @param registerNo  邀请的自动四信用代码
     * @return 回调响应VO
     * @author huabiao
     * @create 2023/12/25  11:07
     */
    CallVo inviteCallback(String inviteId, String result, String companyName, String registerNo);

    /**
     * 契约锁-邀请子公司
     *
     * @param contractLockInviteSubCompanyDTO 契约锁邀请子公司DTTO
     * @return 邀请ID
     * @author huabiao
     * @create 2023/12/25  14:19
     */
    Long inviteSubCompany(ContractLockInviteSubCompanyDTO contractLockInviteSubCompanyDTO);

    /**
     * 契约锁-创建员工
     *
     * @param contractLockCreateEmployeeDTO 契约锁创建员工DTO
     * @author huabiao
     * @create 2023/12/25  14:19
     */
    void createEmployee(ContractLockCreateEmployeeDTO contractLockCreateEmployeeDTO);

    /**
     * 契约锁-修改员工
     *
     * @param contractLockUpdateEmployeeDTO 契约锁修改员工DTO
     * @author huabiao
     * @create 2023/12/25  14:19
     */
    void updateEmployee(ContractLockUpdateEmployeeDTO contractLockUpdateEmployeeDTO);
}