package com.aegis.resource.requisition.service;

import java.util.List;
import com.aegis.resource.requisition.domain.Requisition;
import com.aegis.resource.requisition.domain.RequisitionAgreement;
import com.aegis.resource.requisition.domain.RequisitionCompensation;

/**
 * 征用申请Service接口
 * 
 * @author aegis
 */
public interface IResourceRequisitionService {

    /**
     * 查询征用申请列表
     * 
     * @param requisition 征用申请信息
     * @return 征用申请集合
     */
    public List<Requisition> listRequisitions(Requisition requisition);

    /**
     * 根据ID查询征用申请
     * 
     * @param id 征用ID
     * @return 征用申请信息
     */
    public Requisition getRequisitionById(Long id);

    /**
     * 根据队伍ID查询征用申请列表
     * 
     * @param teamId 队伍ID
     * @return 征用申请集合
     */
    public List<Requisition> listRequisitionsByTeamId(Long teamId);

    /**
     * 校验征用编号是否唯一
     * 
     * @param requisitionNo 征用编号
     * @param id 征用ID（排除自身）
     * @return 结果
     */
    public boolean isRequisitionNoUnique(String requisitionNo, Long id);

    /**
     * 新增征用申请
     * 
     * @param requisition 征用申请信息
     * @return 结果
     */
    public int createRequisition(Requisition requisition);

    /**
     * 修改征用申请
     * 
     * @param requisition 征用申请信息
     * @return 结果
     */
    public int modifyRequisition(Requisition requisition);

    /**
     * 批量删除征用申请
     * 
     * @param ids 需要删除的征用ID数组
     * @return 结果
     */
    public int removeRequisitions(Long[] ids);

    /**
     * 删除征用申请信息
     * 
     * @param id 征用ID
     * @return 结果
     */
    public int removeRequisition(Long id);

    /**
     * 审批通过（draft → approved）
     * 
     * @param id 征用ID
     * @param comment 审批意见
     * @return 结果
     */
    public int approveRequisition(Long id, String comment);

    /**
     * 审批驳回（draft → rejected）
     * 
     * @param id 征用ID
     * @param comment 审批意见
     * @return 结果
     */
    public int rejectRequisition(Long id, String comment);

    /**
     * 开始征用（approved → active，置队伍 busy）
     * 
     * @param id 征用ID
     * @return 结果
     */
    public int startRequisition(Long id);

    /**
     * 结束征用（active → ended，置队伍 available）
     * 
     * @param id 征用ID
     * @return 结果
     */
    public int endRequisition(Long id);

    /**
     * 重新提交（rejected → approved）
     * 
     * @param id 征用ID
     * @return 结果
     */
    public int resubmitRequisition(Long id);

    /**
     * 查询征用协议列表
     * 
     * @param agreement 协议信息
     * @return 协议集合
     */
    public List<RequisitionAgreement> listRequisitionAgreements(RequisitionAgreement agreement);

    /**
     * 根据征用ID查询协议列表
     * 
     * @param requisitionId 征用ID
     * @return 协议集合
     */
    public List<RequisitionAgreement> listRequisitionAgreementsByRequisitionId(Long requisitionId);

    /**
     * 根据ID查询协议
     * 
     * @param id 协议ID
     * @return 协议信息
     */
    public RequisitionAgreement getRequisitionAgreementById(Long id);

    /**
     * 新增征用协议
     * 
     * @param agreement 协议信息
     * @return 结果
     */
    public int createRequisitionAgreement(RequisitionAgreement agreement);

    /**
     * 修改征用协议
     * 
     * @param agreement 协议信息
     * @return 结果
     */
    public int modifyRequisitionAgreement(RequisitionAgreement agreement);

    /**
     * 删除征用协议
     * 
     * @param id 协议ID
     * @return 结果
     */
    public int removeRequisitionAgreement(Long id);

    /**
     * 查询补偿记录列表
     * 
     * @param compensation 补偿信息
     * @return 补偿集合
     */
    public List<RequisitionCompensation> listRequisitionCompensations(RequisitionCompensation compensation);

    /**
     * 根据征用ID查询补偿记录列表
     * 
     * @param requisitionId 征用ID
     * @return 补偿集合
     */
    public List<RequisitionCompensation> listRequisitionCompensationsByRequisitionId(Long requisitionId);

    /**
     * 根据ID查询补偿记录
     * 
     * @param id 补偿ID
     * @return 补偿信息
     */
    public RequisitionCompensation getRequisitionCompensationById(Long id);

    /**
     * 新增补偿记录
     * 
     * @param compensation 补偿信息
     * @return 结果
     */
    public int createRequisitionCompensation(RequisitionCompensation compensation);

    /**
     * 修改补偿记录
     * 
     * @param compensation 补偿信息
     * @return 结果
     */
    public int modifyRequisitionCompensation(RequisitionCompensation compensation);

    /**
     * 删除补偿记录
     * 
     * @param id 补偿ID
     * @return 结果
     */
    public int removeRequisitionCompensation(Long id);

    /**
     * 结算补偿（pending → settled）
     * 
     * @param id 补偿ID
     * @param invoiceNo 发票号
     * @param paidAt 支付时间
     * @return 结果
     */
    public int settleCompensation(Long id, String invoiceNo, java.util.Date paidAt);
}