package eu.dnetlib.goldoa.service;

import eu.dnetlib.goldoa.domain.*;

import javax.mail.MessagingException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

/**
 * Created by antleb on 3/10/15.
 */
public interface RequestManager {

    public Request saveRequest(Request request);

	public RequestInfo getById(String requestId);

    /**
     * @param fromDate          inclusive, starts with 0
     * @param to            non inclusive, < total count
     * @param requestSortBy if not null, sorts by this field
     * @param order         the order of sort, if RequestSortBy != null
     * @param requestFilter which request field to search for, searches for all if null and term != null
     * @param term          if not null, filters the requests
     * @param fromDate
     * @param to
     * @return
     */
    public List<RequestInfo> getRequests(Date fromDate, Date toDate, RequestSort requestSortBy, RequestSortOrder order, RequestFilter requestFilter, String term, Request.RequestStatus[] statusFilter, int from, int to);

    public List<RequestInfo> getForUser(String email, Date fromDate, Date toDate, RequestSort requestSortBy, RequestSortOrder order, RequestFilter requestFilter, String term, Request.RequestStatus[] statusFilter, int from, int to);

    public List<RequestInfo> getForPublisher(String publisher, Date fromDate, Date toDate, RequestSort requestSortBy, RequestSortOrder order, RequestFilter requestFilter, String term, Request.RequestStatus[] statusFilter, int from, int to);

    public List<RequestInfo> getForOrganization(List<String> organizationIds, Date fromDate, Date toDate, RequestSort requestSortBy, RequestSortOrder order, RequestFilter requestFilter, String term, Request.RequestStatus[] statusFilter, int from, int to);

    public List<Request> getForProject(String projectId);

    public Request submitRequest(Request request) throws PersonManagerException;

    public void approveRequest(String requestId, String comment);

    public void rejectRequest(String requestId, String comment);

    public void paidRequest(String requestId, String comment, float apc_paid, float transfer_cost, float other_cost, Date datePaid);

    public void onHoldRequest(String requestId, String comment);

    public void deniedRequest(String requestId, String comment);

    public void invoiceUploaded(String requestId, String invoiceId);

    public void uploadTransferReceipt(String requestid, String contentType, InputStream inputStream);

    public BankTransferReceipt downloadBankTransferReceipt(String requestId) throws RequestManagerException;
}
