package eu.dnetlib.client;

import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
import eu.dnetlib.goldoa.domain.*;
import eu.dnetlib.goldoa.domain.stats.DateSeries;
import eu.dnetlib.shared.*;

import java.util.Date;
import java.util.List;

/**
 * Created by stefania on 3/4/15.
 */
@RemoteServiceRelativePath("dataService")
public interface DataService extends RemoteService {

    public InitLoad load(String hash, String email, String token, String cookie);

    public List<AlternativeFundingBid> getAlternativeFundingBids();

    public String saveOrganization(Organization organization) throws OrganizationManagerException;

    public User loginUser(String email, String password) throws PersonManagerException;

    public void resetPassword(String email) throws PersonManagerException;

    public void registerUser(User user, String captchaChallenge, String captchaResponse) throws Exception;

    public User updateUser(User user) throws PersonManagerException;

    public User getUserById(String userId) throws PersonManagerException;

    public User getUserByEmail(String email) throws PersonManagerException;

    public User saveResearcher(User user) throws PersonManagerException;

    public Request saveRequest(Request request);

    public Request submitRequest(Request request) throws PersonManagerException;

    public ProjectAndEligibility getProjectInfoAndEligibility(String projectId);

    public Publication savePublication(Publication publication);

    public Journal getJournal(String journalId);

    public Publisher getPublisher(String publisherId);

    public Publication resolveDOI(String doi) throws ManagerException;

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

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

    public RequestPage getRequestsForUser(String userId, Date fromDate, Date toDate, RequestSort requestSortBy, RequestSortOrder order,
                                              RequestFilter requestFilter, String term, Request.RequestStatus[] statusFilters,
                                              int from, int to);

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

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

    public FundingWizardState getFundingWizardState(String requestId);

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

    public void conditionalApproveRequest(String requestId, String personId, String comment, String templateId);

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

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

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

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

    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 Request getRequestById(String requestId);

    public void submitContactForm(Contact contact, String captchaChallenge, String captchaResponse) throws Exception;

    public List<User> getUsers();

    public void activateUser(String userId);

    public void activateUsers(List<String> userIds);

    public void deactivateUser(String userId);

    public void deactivateUsers(List<String> userIds);

    public void acceptUserRole(String userId, String roleId);

    public void rejectRole(String userId, String roleId);

    public Budget submitBudgetRequest(Budget budget);

    public Budget saveBudget(Budget budget);

    public Budget getBudgetById(String budgetId);

    public List<Budget> getBudgets();

    public List<Budget> getBudgetsForUser(String userId);

    public List<Budget> getBudgetsForOrganizations(List<String> organizationIds);

    public void initiallyApproveBudgetRequest(String budgetId, String comment, String personId);

    public void approveBudgetRequest(String budgetId, String comment, float amountGranted, String personId);

    public void rejectBudgetRequest(String budgetId, String comment, String personId);

    public void processingPayment(String budgetId, String comment, String personId);

    public void denyPayment(String budgetId, String comment, String personId);

    public void onHoldPayment(String budgetId, String comment, String personId);

    public void budgetPaid(String budgetId, String comment, String personId);

    public EligiblePresentAndFutureProjects getEligibleProjectsForOrganization(String organizationId);

    public Help saveHelp(Help help);

    public Help getHelpById(String id);

    public Invoice invoiceUploaded(String requestId, String invoiceId) throws ManagerException;

    public float convert(Currency from, Currency to, float amount);

    public StatsData getStatsData();

    public DateSeriesData getDateSeriesData(DateSeries.Over over, Date from, Date to, String[] publishers,
                                            String[] organizations, String[] countries, String[] scientificAreas);

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

    public  Organization getOrganization(String organizationId) throws OrganizationManagerException;

    public Project getProject(String projectId);

    List<Object> getFundingBidDocuments(String id) throws Exception;
}
