package eu.dnetlib.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.Style;
import com.google.gwt.user.client.Cookies;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.RootPanel;
import eu.dnetlib.client.adminpanel.AdminPanel;
import eu.dnetlib.client.login.LoginPage;
import eu.dnetlib.espas.gui.client.Crypto;
import eu.dnetlib.espas.gui.client.UserService;
import eu.dnetlib.espas.gui.client.UserServiceAsync;
import eu.dnetlib.espas.gui.shared.User;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Admin implements EntryPoint {

    public static FlowPanel menuBar = new FlowPanel();

    public static List<User> dataProviderAdministrators = new ArrayList<User>();
	
	public static UserServiceAsync userAccessService = GWT.create(UserService.class);

	public void onModuleLoad() {
		
		GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {
			
			Logger logger = Logger.getLogger("UncaughtException");

			@Override
			public void onUncaughtException(Throwable arg0) {

				logger.log(Level.SEVERE, "Exception: ", arg0);
			}
		});

        userAccessService.getDataProviderUsers(new AsyncCallback<List<User>>() {

            @Override
            public void onFailure(Throwable caught) {
            }

            @Override
            public void onSuccess(List<User> administrators) {

                dataProviderAdministrators.addAll(administrators);

                final AdminPanel adminPanel = new AdminPanel();

                RootPanel.get("menubar").add(Admin.menuBar);

                String encryptedEmail = Cookies.getCookie("currentUser");
                if(encryptedEmail==null) {

                    LoginPage loginPage = new LoginPage();
                    LoginPage.LoginListener loginListener = new LoginPage.LoginListener() {
                        @Override
                        public void loginSucceeded(User user) {

                            if(User.currentUser!=null)
                                Document.get().getElementById("currentUser").setInnerText(User.currentUser.getName());

                            adminPanel.showAdminPanel();
                            adminPanel.updateNoOfActions();
                        }
                    };
                    loginPage.setLoginListener(loginListener);
                    loginPage.showLoginPage();

                } else {

                    userAccessService.getUserById(Crypto.decrypt(encryptedEmail), new AsyncCallback<User>() {

                        @Override
                        public void onFailure(Throwable t) {

                            Cookies.removeCookie("currentUser");

                            LoginPage loginPage = new LoginPage();
                            LoginPage.LoginListener loginListener = new LoginPage.LoginListener() {
                                @Override
                                public void loginSucceeded(User user) {

                                    if(User.currentUser!=null)
                                        Document.get().getElementById("currentUser").setInnerText(User.currentUser.getName());

                                    adminPanel.showAdminPanel();
                                    adminPanel.updateNoOfActions();
                                }
                            };
                            loginPage.setLoginListener(loginListener);
                            loginPage.showLoginPage();
                        }

                        @Override
                        public void onSuccess(User user) {

                            User.currentUser = user;
                            if(User.currentUser!=null)
                                Document.get().getElementById("currentUser").setInnerText(User.currentUser.getName());

                            adminPanel.showAdminPanel();
                            adminPanel.updateNoOfActions();
                        }
                    });
                }
            }
        });
	}

    public static void updateDataProviderAdministrators() {

        userAccessService.getDataProviderUsers(new AsyncCallback<List<User>>() {

            @Override
            public void onFailure(Throwable caught) {

            }

            @Override
            public void onSuccess(List<User> administrators) {

                dataProviderAdministrators.clear();
                dataProviderAdministrators.addAll(administrators);
            }
        });
    }
}
