package eu.dnetlib.espas.gui.server;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import eu.dnetlib.espas.gui.client.SearchOptionsService;
import eu.dnetlib.espas.gui.shared.SearchOptions;
import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;

/**
 * Created by stefania on 7/21/15.
 */
@SuppressWarnings("serial")
public class SearchOptionsServiceImpl extends RemoteServiceServlet implements SearchOptionsService {

    private static Logger logger = Logger.getLogger(SearchOptionsServiceImpl.class);

    private SearchOptionsServiceCore searchOptionsServiceCore = null;

    public void init(ServletConfig config) throws ServletException {

        super.init(config);
        ApplicationContext datasourceContext = WebApplicationContextUtils
                .getWebApplicationContext(getServletContext());
        this.searchOptionsServiceCore = (SearchOptionsServiceCore) datasourceContext.getBean("espas.gui.searchOptionsServiceCore");
    }

    @Override
    public String saveSearchOptions(SearchOptions searchOptions) {

        try {
            return searchOptionsServiceCore.saveSearchOptions(searchOptions);
        } catch (IOException e) {
            logger.error("IO Exception saving search options", e);
        } catch (SQLException e) {
            logger.error("SQL Exception saving search options", e);
        }

        return null;
    }

    @Override
    public SearchOptions getSearchOptionsById(String searchOptionsId) {

        try {
            return searchOptionsServiceCore.getSearchOptionsById(searchOptionsId);
        } catch (SQLException e) {
            logger.error("SQL Exception getting search options", e);
        } catch (IOException e) {
            logger.error("IO Exception getting search options", e);
        } catch (ClassNotFoundException e) {
            logger.error("ClassNotFound Exception getting search options", e);
        }

        return null;
    }

    @Override
    public List<SearchOptions> getLocationSearchOptionsByUser(String userId) {

        try {
            return searchOptionsServiceCore.getLocationSearchOptionsByUser(userId);
        } catch (SQLException e) {
            logger.error("SQL Exception getting search options", e);
        } catch (IOException e) {
            logger.error("IO Exception getting search options", e);
        } catch (ClassNotFoundException e) {
            logger.error("ClassNotFound Exception getting search options", e);
        }

        return null;
    }

    @Override
    public void updateSearchOptions(SearchOptions searchOptions) {

        try {
            searchOptionsServiceCore.updateSearchOptions(searchOptions);
        } catch (SQLException e) {
            logger.error("SQL Exception updating search options", e);
        } catch (IOException e) {
            logger.error("IO Exception updating search options", e);
        }
    }

    @Override
    public void deleteLocationSearchOptions(String searchOptionsId) {

        try {
            searchOptionsServiceCore.deleteLocationSearchOptions(searchOptionsId);
        } catch (SQLException e) {
            logger.error("SQL Exception deleting location search options", e);
        }
    }
}
