package controller;


import EntitiesDao.UsersDao;
import HibernateEntities.GroupsEntity;
import HibernateEntities.StudentsEntity;
import HibernateEntities.UsersEntity;
import LoginEntities.LoginClient;
import LoginEntities.LoginUser;
import com.google.gson.Gson;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import java.util.*;

import static EntitiesDao.AdminDao.getAdminList;
import static EntitiesDao.AdminDao.getAdminMap;
import static EntitiesDao.ClientsDao.getClientList;
import static EntitiesDao.ClientsDao.getClientMap;
import static EntitiesDao.GroupDao.getGroupList;
import static EntitiesDao.StudentDao.loadStudent;

/**
 * Created by Кинетик on 28.12.2016.
 */
@Controller
public class controller {
    ModelAndView mvAdmin = new ModelAndView();
    ModelAndView mvClient = new ModelAndView();
    ModelAndView mvStudent = new ModelAndView();
    ModelAndView mvUsers = new ModelAndView();
    {
        //Блок инициализации всех view, которые используются при авторизации
        mvAdmin.setViewName("loginViews/adminBar");
        mvClient.setViewName("loginViews/ownerBar");
        mvStudent.setViewName("loginViews/studentBar");
        mvUsers.setViewName("loginViews/index");
    }
    //Мапит запрос на вход на сайт, возвращает страницу index и грузит в нее объект, чтобы записывать данные в него
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public ModelAndView main() {
        mvUsers.addObject("userJSP", new LoginUser());
        return mvUsers;
    }
    //Метод осуществляет проверку первого уровня аутентификации. Комментарий про мапу аналогичен след методу - надо подумать+посовещаться
    @RequestMapping(value = "/check-user")
    public ModelAndView checkUser(@ModelAttribute("userJSP") LoginUser user) {
        HashMap<String, UsersEntity> userDict = UsersDao.getUserList();
        if(userDict.containsKey(user.getName())){
            if(userDict.get(user.getName()).getUserPassword().equals(user.getPassword())){
                if(Objects.equals(user.getName(), "модератор")){
                    ArrayList<String> adminList = getAdminList();
                    //Нет смысла создавать LoginAdmin - поля те же, что и у заказчика
                    mvAdmin.addObject("adminLogin", new LoginClient());
                    mvAdmin.addObject("adminList", adminList);
                    mvUsers.addObject("message","");
                    return mvAdmin;
                } else if(Objects.equals(user.getName(), "заказчик")){
                    ArrayList<String> clientList = getClientList();
                    mvClient.addObject("clientLogin", new LoginClient());
                    mvClient.addObject("clientList", clientList);
                    mvUsers.addObject("message","");
                    return mvClient;
                } else {
                    mvUsers.addObject("message","");
                    mvStudent.addObject("studentLogin", new LoginClient());
                    return mvStudent;
                }
            } else {
                mvUsers.addObject("message","Bad password");
            }
        } else {
            mvUsers.addObject("message", "Bad login");
        }

        return mvUsers;
    }
    @RequestMapping(value = "/checkClient")
    public ModelAndView checkClient(@ModelAttribute("clientLogin") LoginClient client){
        ModelAndView mv = new ModelAndView();
        /*За эту мапу вообще стыдно, в перспективе подумать как переписать - что быстрее запросить пользователя с логином из БД
        или вот так вытащить все. Пока думаю, что теряем в памяти - приобретаем в скорости и наоборот
         */
        HashMap<String, String> clientAll = getClientMap();
        if(clientAll.containsKey(client.getName())){
            if(clientAll.get(client.getName()).equals(client.getPassword())){
                mv.setViewName("ownerIn");
                mvClient.addObject("message","");
            } else {
                mvClient.addObject("message", "Bad password");
                return mvClient;
            }
        } else {
            mvClient.addObject("message", "Bad login");
            return mvClient;
        }
        return mv;
    }
    @RequestMapping(value = "/checkAdmin")
    public ModelAndView checkAdmin(@ModelAttribute("adminLogin") LoginClient admin){
        ModelAndView mv = new ModelAndView();
        HashMap<String, String> adminMap = getAdminMap();
        if(adminMap.containsKey(admin.getName())){
            if(adminMap.get(admin.getName()).equals(admin.getPassword())){
                mv.setViewName("adminIn");
                mvAdmin.addObject("message","");
            } else {
                mvAdmin.addObject("message", "Bad password");
                return mvAdmin;
            }
        } else {
            mvAdmin.addObject("message", "Bad login");
            return mvAdmin;
        }
        return mv;
    }
    @RequestMapping(value = "/loadStudents", method = RequestMethod.GET)
    public @ResponseBody
    Set<StudentsEntity> loadStudents(@RequestParam(value = "groupId", required = true) Integer groupId) throws IllegalStateException {
        List<StudentsEntity> stList = loadStudent(groupId);
        return new HashSet<>(stList);
    }
    @RequestMapping(value = "/loadGroups", method = RequestMethod.GET)
    public @ResponseBody
    Set<GroupsEntity> loadGroups(){
        List<GroupsEntity> groupList = getGroupList();
        return new HashSet<>(groupList);
    }
    @RequestMapping(value = "/checkStudent", method = RequestMethod.GET)
    public ModelAndView checkStudent(@ModelAttribute("studentLogin") LoginClient student){
        return mvUsers;
    }
    @RequestMapping(value="/aboutUs")
    public ModelAndView aboutUs(){
        return new ModelAndView("aboutPage");
    }
    @RequestMapping(value="/contacts")
    public ModelAndView contacts(){
        return new ModelAndView("contactPage");
    }

}
