package com.aegis.resource.procurement.service;

import java.util.List;
import com.aegis.resource.procurement.domain.Procurement;
import com.aegis.resource.procurement.domain.ProcurementItem;
import com.aegis.resource.procurement.domain.ProcurementQuote;

/**
 * 采购申请Service接口
 * 
 * @author aegis
 */
public interface IResourceProcurementService {

    /**
     * 查询采购申请列表
     * 
     * @param procurement 采购申请信息
     * @return 采购申请集合
     */
    public List<Procurement> listProcurements(Procurement procurement);

    /**
     * 根据ID查询采购申请
     * 
     * @param id 采购ID
     * @return 采购申请信息
     */
    public Procurement getProcurementById(Long id);

    /**
     * 校验采购编号是否唯一
     * 
     * @param procurementNo 采购编号
     * @param id 采购ID（排除自身）
     * @return 结果
     */
    public boolean isProcurementNoUnique(String procurementNo, Long id);

    /**
     * 新增采购申请
     * 
     * @param procurement 采购申请信息
     * @return 结果
     */
    public int createProcurement(Procurement procurement);

    /**
     * 修改采购申请
     * 
     * @param procurement 采购申请信息
     * @return 结果
     */
    public int modifyProcurement(Procurement procurement);

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

    /**
     * 删除采购申请信息
     * 
     * @param id 采购ID
     * @return 结果
     */
    public int removeProcurement(Long id);

    /**
     * 提交采购申请（draft → submitted）
     * 
     * @param id 采购ID
     * @return 结果
     */
    public int submitProcurement(Long id);

    /**
     * 审核通过（submitted → approved）
     * 
     * @param id 采购ID
     * @param comment 审核意见
     * @return 结果
     */
    public int approveProcurement(Long id, String comment);

    /**
     * 审核驳回（submitted → rejected）
     * 
     * @param id 采购ID
     * @param comment 审核意见
     * @return 结果
     */
    public int rejectProcurement(Long id, String comment);

    /**
     * 重新提交（rejected → draft）
     * 
     * @param id 采购ID
     * @return 结果
     */
    public int resubmitProcurement(Long id);

    /**
     * 确认中标供应商（approved → in_progress）
     * 
     * @param id 采购ID
     * @param quoteId 报价ID
     * @return 结果
     */
    public int awardProcurement(Long id, Long quoteId);

    /**
     * 采购入库（in_progress → received）
     * 
     * @param id 采购ID
     * @param warehouseId 仓库ID（物资入库时使用）
     * @return 结果
     */
    public int receiveProcurement(Long id, Long warehouseId);

    /**
     * 查询采购明细列表
     * 
     * @param item 采购明细信息
     * @return 采购明细集合
     */
    public List<ProcurementItem> listProcurementItems(ProcurementItem item);

    /**
     * 根据采购申请ID查询明细列表
     * 
     * @param procurementId 采购申请ID
     * @return 采购明细集合
     */
    public List<ProcurementItem> listProcurementItemsByProcurementId(Long procurementId);

    /**
     * 根据ID查询采购明细
     * 
     * @param id 明细ID
     * @return 采购明细信息
     */
    public ProcurementItem getProcurementItemById(Long id);

    /**
     * 新增采购明细
     * 
     * @param item 采购明细信息
     * @return 结果
     */
    public int createProcurementItem(ProcurementItem item);

    /**
     * 修改采购明细
     * 
     * @param item 采购明细信息
     * @return 结果
     */
    public int modifyProcurementItem(ProcurementItem item);

    /**
     * 删除采购明细
     * 
     * @param id 明细ID
     * @return 结果
     */
    public int removeProcurementItem(Long id);

    /**
     * 供应商报价
     * 
     * @param quote 报价信息
     * @return 结果
     */
    public int submitQuote(ProcurementQuote quote);

    /**
     * 查询报价列表
     * 
     * @param quote 报价信息
     * @return 报价集合
     */
    public List<ProcurementQuote> listProcurementQuotes(ProcurementQuote quote);

    /**
     * 根据采购申请ID查询报价列表
     * 
     * @param procurementId 采购申请ID
     * @return 报价集合
     */
    public List<ProcurementQuote> listProcurementQuotesByProcurementId(Long procurementId);

    /**
     * 根据ID查询报价
     * 
     * @param id 报价ID
     * @return 报价信息
     */
    public ProcurementQuote getProcurementQuoteById(Long id);
}