package com.ruoyi.credit.service;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.credit.domain.ContractEmployeeLink;
import com.ruoyi.credit.domain.ServicePeriod;
import com.ruoyi.credit.domain.ServicePeriodEmployee;
import com.ruoyi.credit.domain.ServicePeriodLoan;

/**
 * 合同员工关联服务接口
 * 
 * @author ruoyi
 * @date 2025-12-23
 */
public interface IContractEmployeeService
{
    // ==================== 合同员工关联管理 ====================
    
    /**
     * 关联单个员工到合同
     * 
     * @param contractId 合同ID
     * @param employeeId 员工ID
     * @param assignedRole 分配角色
     * @return 关联结果
     */
    public ContractEmployeeLink linkIndividualEmployeeToContract(Long contractId, Long employeeId, String assignedRole);

    /**
     * 批量关联员工到合同
     * 
     * @param contractId 合同ID
     * @param employeeIds 员工ID列表
     * @param assignedRole 分配角色
     * @return 关联结果列表
     */
    public List<ContractEmployeeLink> linkMultipleEmployeesToContract(Long contractId, List<Long> employeeIds, String assignedRole);

    /**
     * 查询合同关联的员工
     * 
     * @param contractId 合同ID
     * @return 员工关联列表
     */
    public List<ContractEmployeeLink> getContractEmployeeLinks(Long contractId);

    /**
     * 取消合同员工关联
     * 
     * @param linkId 关联ID
     * @return 结果
     */
    public int unlinkContractEmployee(Long linkId);

    // ==================== 服务周期管理 ====================

    /**
     * 创建服务周期
     * 
     * @param servicePeriod 服务周期信息
     * @return 服务周期
     */
    public ServicePeriod createServicePeriod(ServicePeriod servicePeriod);

    /**
     * 查询服务周期
     * 
     * @param servicePeriodId 服务周期ID
     * @return 服务周期
     */
    public ServicePeriod getServicePeriod(Long servicePeriodId);

    /**
     * 查询服务周期列表
     * 
     * @param servicePeriod 服务周期查询条件
     * @return 服务周期列表
     */
    public List<ServicePeriod> selectServicePeriodList(ServicePeriod servicePeriod);

    /**
     * 查询合同的服务周期列表
     * 
     * @param contractId 合同ID
     * @return 服务周期列表
     */
    public List<ServicePeriod> getServicePeriodsByContract(Long contractId);

    /**
     * 更新服务周期
     * 
     * @param servicePeriod 服务周期信息
     * @return 结果
     */
    public int updateServicePeriod(ServicePeriod servicePeriod);

    /**
     * 删除服务周期
     * 
     * @param servicePeriodId 服务周期ID
     * @return 结果
     */
    public int deleteServicePeriod(Long servicePeriodId);

    // ==================== 服务周期出勤员工选择 ====================

    /**
     * 为服务周期选择出勤员工
     * 
     * @param servicePeriodId 服务周期ID
     * @param employeeIds 员工ID列表
     * @param workDays 工作天数
     * @return 分配结果列表
     */
    public List<ServicePeriodEmployee> selectAttendanceEmployees(Long servicePeriodId, List<Long> employeeIds, Integer workDays);

    /**
     * 查询服务周期的员工分配
     * 
     * @param servicePeriodId 服务周期ID
     * @return 员工分配列表
     */
    public List<ServicePeriodEmployee> getServicePeriodEmployees(Long servicePeriodId);

    /**
     * 查询服务周期的员工分配（包含员工详细信息）
     * 
     * @param servicePeriodId 服务周期ID
     * @return 员工分配DTO列表
     */
    public List<com.ruoyi.credit.dto.ServicePeriodEmployeeDTO> getServicePeriodEmployeesWithInfo(Long servicePeriodId);

    /**
     * 更新员工分配信息
     * 
     * @param servicePeriodEmployee 员工分配信息
     * @return 结果
     */
    public int updateServicePeriodEmployee(ServicePeriodEmployee servicePeriodEmployee);

    /**
     * 移除服务周期员工分配
     * 
     * @param assignmentId 分配ID
     * @return 结果
     */
    public int removeServicePeriodEmployee(Long assignmentId);

    /**
     * 批量移除服务周期员工分配
     * 
     * @param servicePeriodId 服务周期ID
     * @param assignmentIds 分配ID列表
     * @return 批量删除结果
     */
    public Map<String, Object> batchRemoveServicePeriodEmployees(Long servicePeriodId, List<Long> assignmentIds);

    /**
     * 清空服务周期所有员工分配
     * 
     * @param servicePeriodId 服务周期ID
     * @return 清空结果
     */
    public Map<String, Object> clearAllServicePeriodEmployees(Long servicePeriodId);

    // ==================== OCR信息提取 ====================

    /**
     * 通过OCR自动提取员工信息
     * 
     * @param contractFile 合同文件
     * @return 提取的员工信息
     */
    public Map<String, Object> extractEmployeeInfoFromOCR(MultipartFile contractFile);

    /**
     * 手动调整薪资标准
     * 
     * @param servicePeriodId 服务周期ID
     * @param employeeId 员工ID
     * @param adjustedSalary 调整后的薪资
     * @param salaryType 薪资类型(HOURLY/DAILY/MONTHLY)
     * @return 调整结果
     */
    public int adjustSalaryStandard(Long servicePeriodId, Long employeeId, BigDecimal adjustedSalary, String salaryType);

    /**
     * 批量调整薪资标准
     * 
     * @param servicePeriodId 服务周期ID
     * @param salaryAdjustments 薪资调整信息 (employeeId -> adjustedSalary)
     * @return 调整结果
     */
    public Map<String, Object> batchAdjustSalaryStandards(Long servicePeriodId, Map<Long, BigDecimal> salaryAdjustments);

    // ==================== 人工成本计算 ====================

    /**
     * 计算服务周期人工成本
     * 
     * @param servicePeriodId 服务周期ID
     * @return 人工成本计算结果
     */
    public Map<String, Object> calculateLaborCost(Long servicePeriodId);

    /**
     * 计算单个员工成本
     * 
     * @param employeeId 员工ID
     * @param workDays 工作天数
     * @param salaryType 薪资类型
     * @return 员工成本
     */
    public BigDecimal calculateEmployeeCost(Long employeeId, Integer workDays, String salaryType);

    /**
     * 重新计算服务周期总成本
     * 
     * @param servicePeriodId 服务周期ID
     * @return 更新后的总成本
     */
    public BigDecimal recalculateTotalCost(Long servicePeriodId);

    // ==================== 数据验证 ====================

    /**
     * 验证员工是否可以分配到服务周期
     * 
     * @param employeeId 员工ID
     * @param servicePeriodId 服务周期ID
     * @return 验证结果
     */
    public Map<String, Object> validateEmployeeAssignment(Long employeeId, Long servicePeriodId);

    /**
     * 生成服务周期编号
     * 
     * @param contractId 合同ID
     * @return 服务周期编号
     */
    public String generateServicePeriodNumber(Long contractId);

    // ==================== 服务周期贷款管理 ====================

    /**
     * 查询服务周期的贷款列表
     * 
     * @param servicePeriodId 服务周期ID
     * @return 贷款列表
     */
    public List<ServicePeriodLoan> getServicePeriodLoans(Long servicePeriodId);

    /**
     * 更新服务周期贷款信息
     * 
     * @param servicePeriodLoan 贷款信息
     * @return 更新结果
     */
    public int updateServicePeriodLoan(ServicePeriodLoan servicePeriodLoan);

    /**
     * 删除服务周期贷款信息
     * 
     * @param linkId 贷款关联ID
     * @return 删除结果
     */
    public int deleteServicePeriodLoanByLinkId(Long linkId);

    /**
     * 根据服务周期出勤记录申请贷款
     * 
     * @param servicePeriodId 服务周期ID
     * @param loanRequest 贷款申请信息
     * @return 贷款申请结果
     */
    public Map<String, Object> applyLoanBasedOnAttendance(Long servicePeriodId, Map<String, Object> loanRequest);

    /**
     * 计算基于出勤数据的贷款金额
     * 
     * @param servicePeriodId 服务周期ID
     * @return 计算结果
     */
    public Map<String, Object> calculateLoanAmountBasedOnAttendance(Long servicePeriodId);

    /**
     * 验证贷款金额计算并获取允许范围
     * 
     * @param servicePeriodId 服务周期ID
     * @param requestedAmount 申请金额
     * @return 验证结果和允许范围
     */
    public Map<String, Object> validateLoanAmountCalculation(Long servicePeriodId, BigDecimal requestedAmount);

    /**
     * 根据合同期限条件选择银行融资参数
     * 
     * @param servicePeriodId 服务周期ID
     * @param contractTermMonths 合同期限(月)
     * @return 匹配的银行融资条件
     */
    public Map<String, Object> selectBankFinancingByContractTerm(Long servicePeriodId, Integer contractTermMonths);

    /**
     * 生成服务周期贷款报表
     * 
     * @param servicePeriodId 服务周期ID
     * @param reportType 报表类型
     * @return 报表数据
     */
    public Map<String, Object> generateServicePeriodLoanReport(Long servicePeriodId, String reportType);

    /**
     * 导出服务周期贷款与出勤关联报表
     * 
     * @param servicePeriodId 服务周期ID
     * @param format 导出格式(EXCEL/PDF/CSV)
     * @return 导出结果
     */
    public Map<String, Object> exportLoanAttendanceReport(Long servicePeriodId, String format);

    /**
     * 修复历史薪资计算错误的数据
     * 
     * @param servicePeriodId 服务周期ID
     * @return 修复结果
     */
    public Map<String, Object> fixSalaryCalculationData(Long servicePeriodId);

}