package com.usky.vpp.service;

import com.usky.common.core.bean.CommonPage;
import com.usky.vpp.domain.VppCustomerContact;
import com.usky.vpp.service.vo.CustomerAccessAuditRequest;
import com.usky.vpp.service.vo.CustomerAccessRequestVO;
import com.usky.vpp.service.vo.CustomerAccessResponseVO;
import com.usky.vpp.service.vo.CustomerContactRequest;
import com.usky.vpp.service.vo.CustomerRequestVO;
import com.usky.vpp.service.vo.CustomerResponseVO;

import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;

/**
 * 客户管理业务接口
 *
 * @author fyc
 * @email yuchuan.fu@chinausky.com
 * @date 2026/7/6
 */
public interface VppCustomerService {

    // ==================== 准入管理 ====================

    /**
     * 提交准入申请
     */
    Boolean submitAccess(CustomerAccessRequestVO request);

    /**
     * 分页查询准入申请
     */
    CommonPage<CustomerAccessResponseVO> pageAccess(Long id, Integer accessStatus, String customerName,
                                                    LocalDateTime startTime, LocalDateTime endTime,
                                                    Integer pageNum, Integer pageSize);

    /**
     * 审核准入申请
     */
    void auditAccess(CustomerAccessAuditRequest request);

    /**
     * 修改已驳回的准入申请（修改后重新进入待审核）
     */
    Boolean updateAccess(CustomerAccessRequestVO request);

    /**
     * 删除准入申请（软删除）
     */
    Boolean deleteAccess(Long id);

    /**
     * 导出准入申请数据（Excel）
     *
     * @param scope        导出范围：current / all / filtered
     * @param fileName     文件名（不含扩展名）
     * @param id           申请ID精确匹配（filtered 模式可用）
     * @param accessStatus 准入状态（filtered 模式可用）
     * @param customerName 客户名称模糊匹配（filtered 模式可用）
     * @param startTime    申请时间起（filtered 模式可用）
     * @param endTime      申请时间止（filtered 模式可用）
     * @param current      当前页码（current 模式必传）
     * @param size         页大小（current 模式必传）
     */
    void exportAccess(String scope, String fileName, Long id, Integer accessStatus,
                      String customerName, LocalDateTime startTime, LocalDateTime endTime,
                      Integer current, Integer size, HttpServletResponse response);

    // ==================== 客户管理 ====================

    /**
     * 直接新增客户（跳过准入流程）
     */
    Boolean createCustomer(CustomerRequestVO vo);

    /**
     * 分页查询客户（含关联合同）
     */
    CommonPage<CustomerResponseVO> pageCustomer(Long id, String customerName, String accountNo,
                                                Integer lifecycleStatus, Integer customerType,
                                                Integer pageNum, Integer pageSize);

    /**
     * 查询客户详情（含关联合同）
     */
    CustomerResponseVO getCustomer(Long id);

    /**
     * 更新客户信息
     */
    Boolean updateCustomer(CustomerRequestVO vo);

    /**
     * 删除客户（软删除）
     */
    Boolean deleteCustomer(Long id);

    /**
     * 导出客户数据（Excel）
     *
     * @param scope          导出范围：current / all / filtered
     * @param fileName       文件名（不含扩展名）
     * @param customerName   客户名称（模糊匹配，filtered 模式可用）
     * @param lifecycleStatus 签约状态（filtered 模式可用）
     * @param current        当前页码（current 模式必传）
     * @param size           页大小（current 模式必传）
     */
    void exportCustomers(String scope, String fileName, String customerName,
                         Integer lifecycleStatus, Integer current, Integer size,
                         HttpServletResponse response);

    // ==================== 联系人管理 ====================

    /**
     * 分页查询联系人
     */
    CommonPage<VppCustomerContact> listContact(Long customerId, Integer pageNum, Integer pageSize);

    /**
     * 新增联系人
     */
    VppCustomerContact addContact(Long customerId, CustomerContactRequest request);

    /**
     * 更新联系人
     */
    void updateContact(Long customerId, Long contactId, CustomerContactRequest request);

    /**
     * 删除联系人
     */
    void deleteContact(Long customerId, Long contactId);
}
