package com.usky.vpp.service;

import com.usky.common.core.bean.CommonPage;
import com.usky.vpp.service.vo.VppContractExpireStatVO;
import com.usky.vpp.service.vo.VppContractOverviewVO;
import com.usky.vpp.service.vo.VppContractRequestVO;
import com.usky.vpp.service.vo.VppContractResponseVO;

import javax.servlet.http.HttpServletResponse;
import java.time.LocalDate;
import java.util.Map;

/**
 * VppContractService 业务接口
 */
public interface VppContractService {

    default Object stub(String action, Map<String, Object> params) {
        return null;
    }

    /**
     * 新增合同
     */
    Boolean create(VppContractRequestVO vo);

    /**
     * 修改合同
     */
    Boolean update(VppContractRequestVO vo);

    /**
     * 分页查询合同
     * @param id             主键ID（精确匹配）
     * @param signDateStart  签约日期起始
     * @param signDateEnd    签约日期截止
     * @param templateId     模板ID
     * @param contractType   合同类型
     * @param customerId     客户ID
     * @param customerName   客户名称（模糊匹配）
     * @param signDateStart  签订时间起始
     * @param signDateEnd    签订时间截止
     * @param contractStatus 合同状态
     * @param pageNum        页码
     * @param pageSize       页大小
     */
    CommonPage<VppContractResponseVO> page(Long id, LocalDate signDateStart, LocalDate signDateEnd,
                                           Long templateId, Integer contractType, Long customerId,
                                           String customerName, LocalDate signDateRangeStart, LocalDate signDateRangeEnd,
                                           Integer contractStatus, Integer pageNum, Integer pageSize);

    /**
     * 删除合同（软删除）
     */
    Boolean delete(Long id);

    /**
     * 下载合同文件
     */
    void download(Long id, HttpServletResponse response);

    /**
     * 按客户最新合同统计已到期 / 即将到期（近三个月）数量
     * <p>租户隔离；每个客户仅取创建时间最新的一份合同，再按到期日分类统计数量。
     * 列表请走分页接口，按 contractStatus=5（已到期）/ 7（即将到期）查询。</p>
     */
    VppContractExpireStatVO expireStat();

    /**
     * 合同概况：甲方、乙方、签订日期、合同金额、起止时间、生效状态
     */
    VppContractOverviewVO overview(Long id);
}
