package eu.dnetlib.goldoa.service;

import eu.dnetlib.goldoa.domain.BankTransferReceipt;
import eu.dnetlib.goldoa.domain.CommentTemplate;
import eu.dnetlib.goldoa.domain.PersonManagerException;
import eu.dnetlib.goldoa.domain.Request;
import eu.dnetlib.goldoa.domain.RequestFilter;
import eu.dnetlib.goldoa.domain.RequestInfo;
import eu.dnetlib.goldoa.domain.RequestInfoPage;
import eu.dnetlib.goldoa.domain.RequestManagerException;
import eu.dnetlib.goldoa.domain.RequestSort;
import eu.dnetlib.goldoa.domain.RequestSortOrder;

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 RequestInfoPage getRequests(Date fromDate, Date toDate, RequestSort requestSortBy, RequestSortOrder order, RequestFilter requestFilter, String term, Request.RequestStatus[] statusFilter, int from, int to);

	public RequestInfoPage getForAccounting(Date fromDate, Date toDate, RequestSort requestSortBy, RequestSortOrder order, RequestFilter requestFilter, String term, Request.RequestStatus[] statusFilter, int from, int to);

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

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

	public RequestInfoPage 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 String getCSV(String mode, RequestSort requestSortBy, RequestSortOrder order, RequestFilter requestFilter, String term, Request.RequestStatus[] statusFilter);

	public Request submitRequest(Request request) throws PersonManagerException;

	public Request submitLibraryRequest(Request request) throws PersonManagerException;

	public Request submitPublisherRequest(Request request) throws PersonManagerException;

	public void conditionallyApproveRequest(String requestId, String personId, String comment, String template);

	public void approveRequest(String requestId, String personId, String comment, String template);

	public void rejectRequest(String requestId, String personId, String comment, String template);

	public void processingRequest(String requestId, String personId, String comment, String template);

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

	public void paidLibraryRequest(String requestId, String personId, String comment, String template, float apc_paid, float transfer_cost, float other_cost, Date datePaid);

	public void paidPublisherRequest(String requestId, String personId, String comment, String template, float apc_paid, float transfer_cost, float other_cost, Date datePaid);

	public void onHoldRequest(String requestId, String personId, String comment, String template);

	public void deniedRequest(String requestId, String personId, String comment, String template);

	public void invoiceUploaded(String requestId, String invoiceId);

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

	public BankTransferReceipt downloadBankTransferReceipt(String requestId) throws RequestManagerException;

	public List<CommentTemplate> getCommentTemplates(Request.RequestStatus requestStatus);
}
