package com.uca;

import com.uca.dao._Initializer;
import com.uca.gui.*;
import com.uca.core.*;
import com.uca.entity.*;
import java.sql.Date;
import java.util.*;
import static spark.Spark.*;
import java.text.*;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;

public class StartServer {

    //.\gradlew run

    public static boolean authentified = false;
    public static ProfEntity connected = null;


    
    public static void displayLocalHost(int portNb, String suffix)
    {
        System.out.println("http://localhost:"+portNb+"/"+suffix);
    }
    public static void main(String[] args) {

        int portNb = 8081;
        //Configure Spark
        staticFiles.location("/static/");
        port(portNb);


        _Initializer.Init();

        // Debug:
        connected = _Initializer.DEBUG_BORIS_ADMIN;
        authentified = true;

        //Defining our routes
        displayLocalHost(portNb, "users");
        get("/users", (req, res) -> {
            return UserGUI.getAllUsers();
        });

        displayLocalHost(portNb, "profs");
        get("/profs", (req, res) -> {
            if (authentified)
            {
                return ProfGUI.getAllProfs();
            }
            else
            {
                res.redirect("/login");
                return null;
            }
            
        });

        get("/welcome",(req,res) -> {
            if (authentified)
            {
                return ProfGUI.getWelcomePage(connected);
            }
            else
            {
                res.redirect("/login");
                return null;
            }
        });

        post("/profs/delete",(req,res) -> {
            Core.Prof.delete(Integer.parseInt(req.queryParams("id")));
            res.redirect("/profs");
            return null;
        });


        displayLocalHost(portNb, "login");
        get("/login",(req,res)->{
            return LoginGUI.getConnectionPage();
        });

        post("/login",(req,res)->{
            String username = req.queryParams("userName");
            String password = req.queryParams("password");
            List<ProfEntity> profs = Core.Prof.getAll();
            ProfEntity found = null;
            for (ProfEntity prof: profs) {
                if (prof.getUserName().compareTo(username) == 0){
                    found = prof;
                    break;
                }
            }
            if (found != null) {
                if (found.getPassword().compareTo(password) == 0) {
                    authentified = true;
                    connected = found;
                    res.redirect("/welcome");
                    System.out.println(found);
                    return null;
                }
            }
            
            return "<!DOCTYPE html><html>Incorrect<a href=\'/login\'>Reessayer</a></html>";
        });



        get("/eleves",(req,res)->{
            if (authentified) {
                return EleveGUI.getAllEleves();
            }
            else {
                res.redirect("/login");
                return null;
            }
        });

        get("/eleves/gommettes",(req,res)->{

            String id = req.queryParams("id");
            return EleveGommetteGUI.getEleveGommettes(Integer.parseInt(id));
        });


        post("/eleves/ajout", (req,res)->{
            String firstName = req.queryParams("firstName");
            String lastName = req.queryParams("lastName");
            String dateNaissance = req.queryParams("dateNaissance");



            DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            java.util.Date d = format.parse(dateNaissance);

            java.sql.Date date = new java.sql.Date(d.getTime());


            String nomClasse = req.queryParams("nomClasse");

            System.out.println(firstName + " " + lastName + " " + date.toString() + " " + nomClasse);

            Core.Eleve.create(firstName,lastName,date,nomClasse);

            res.redirect("/eleves");
            return null;
        });

        post("/eleves/gommette/delete", (req,res)->{
            System.out.println("deleted gommette");
            Core.GommetteAttrib.delete(Integer.parseInt(req.queryParams("id")));


            res.redirect("/eleves");
            return null;
        });

        post("/eleves/gommette/ajout", (req,res)->{
            if (! authentified)
            {
                res.redirect("/login");
                return null;
            }
            String raison      = req.queryParams("raison");
            int idGommette     = Integer.parseInt(req.queryParams("idGommette"));
            int idEleve        = Integer.parseInt(req.queryParams("idEleve"));

            String url = req.url();
            url = url.substring(0,  url.lastIndexOf('/'));
            url = url+"s?id="+idEleve+"&id=";

            Core.GommetteAttrib.create(idEleve,connected.getId(),idGommette, new java.sql.Date(System.currentTimeMillis()), raison);
            System.out.println("url: "+url);
            res.redirect(url);
            return null;
        });

        post("/eleves/delete", (req,res) ->{
            Core.Eleve.delete(Integer.parseInt(req.queryParams("id")));
            res.redirect("/eleves");
            return null;
        });


        post("/eleves/update", (req,res) ->{

            String firstName = req.queryParams("firstName");
            String lastName = req.queryParams("lastName");
            String dateNaissance = req.queryParams("dateNaissance");

            String[] tokens = dateNaissance.split("-");

            DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            java.util.Date d = format.parse(dateNaissance);

            java.sql.Date date = new java.sql.Date(d.getTime());
            

            String nomClasse = req.queryParams("nomClasse");
            String id = req.queryParams("id_selection");

            Core.Eleve.update(Integer.parseInt(id),firstName,lastName,date,nomClasse);
            res.redirect("/eleves");
            return null;
        });


        get("/gommettes", (req,res) ->{
            if (authentified) {
                return GommetteGUI.getAllGommettes();
            }
            else {
                res.redirect("/login");
                return null;
            }
        });

        post("/gommettes/ajout", (req,res) ->{
            String couleur = req.queryParams("couleur");

            if (couleur != null)
            {
                Couleur c = Couleur.retrieve(couleur);
                System.out.println(c);
                if (c != null)
                { 
                    String description = req.queryParams("description");
                    String nom = req.queryParams("nom");
                    Core.Gommette.create(nom,c, description);
                    
                }
            }
            res.redirect("/gommettes");
            return null;
        });

        post("/gommettes/update", (req,res)->{

            
            String couleur = req.queryParams("couleur");
            
            Couleur c = Couleur.retrieve(couleur);
        
            String description = req.queryParams("description");
            String nom = req.queryParams("nom");
            String id = req.queryParams("id_selection");
            

            Core.Gommette.update(Integer.parseInt(id),nom,c, description);
            
            res.redirect("/gommettes");
            return null;
        });



    }
}