package projet;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.time.LocalDate;
import java.util.ArrayList;

import projet.Page.Droit;



public class Utilisateur extends ParamBD {
	private int id;
	private String login;
	private Privilege privilege;
	private ArrayList<Page> listePages;
	private ArrayList<Page> listePagesPartagees;
	
	public enum Privilege {
	    ADMIN,
	    USER,
	    GUEST
	}
	
	public Utilisateur(int id, String login) {
		if (login == null || login.isEmpty()) {
            throw new IllegalArgumentException("Le pseudo ne peut pas être vide.");
        }
	    this.id = id;
	    this.login = login;
	}
	
	public Utilisateur(int id, String login, Privilege privilege) {
		if (login == null || login.isEmpty()) {
            throw new IllegalArgumentException("Le pseudo ne peut pas être vide.");
        }
	    this.id = id;
	    this.login = login;
	    this.privilege = privilege;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}
	
	public String getLogin() {
		return login;
	}

	public void setLogin(String login) {
		this.login = login;
	}
	
	public String getPrivilege() {
		return privilege.name();
	}

	public void setPrivilege(Privilege privilege) {
		this.privilege = privilege;
	}

	public ArrayList<Page> getListePages() {
		return listePages;
	}

	public void setListePages(ArrayList<Page> listePages) {
		this.listePages = listePages;
	}

	public String toString() {
        return "Utilisateur{id=" + id + ", login='" + login + "', privilege=" + privilege + "}";
    }
	
	public ArrayList<Page> getListePagesPartagees() {
		return listePagesPartagees;
	}

	public void setListePagesPartagees(ArrayList<Page> listePagesPartagees) {
		this.listePagesPartagees = listePagesPartagees;
	}

	protected void chargerPages(){
		try {
			Connection connexion = DriverManager.getConnection(bdURL, bdLogin, bdPassword);
			String sql = " SELECT id, auteur_id, titre, date_creation, date_modification, droits"
					+ " FROM page"
					+ " WHERE auteur_id="
					+ this.id
					+ ";";
			Statement st = connexion.createStatement();
			ResultSet rs = st.executeQuery(sql);
			
			listePages = new ArrayList<Page>();
			while(rs.next()) {
				int idPage = rs.getInt("id");
				int auteur_id = rs.getInt("auteur_id");
				String titre = rs.getString("titre");
				LocalDate date_creation = rs.getDate("date_creation").toLocalDate();
				LocalDate date_modification = rs.getDate("date_modification").toLocalDate();
				String droits = rs.getString("droits");
				Droit droitsEnum = Droit.valueOf(droits.toUpperCase());
				
				listePages.add(new Page(idPage, auteur_id, titre, date_creation, date_modification, droitsEnum));
			}
			rs.close();
			st.close();
			connexion.close();
        } catch (SQLException e) {
			e.printStackTrace();
		}	
	}
	
	protected void chargerPagesPartagees(){
		try {
			Connection connexion = DriverManager.getConnection(bdURL, bdLogin, bdPassword);
			String sql = " SELECT page.id, titre"
					+ " FROM partage"
					+ " JOIN page ON partage.page_id = page.id"
					+ " WHERE utilisateur_id="
					+ this.id
					+ ";";
			Statement st = connexion.createStatement();
			ResultSet rs = st.executeQuery(sql);
			
			listePagesPartagees = new ArrayList<Page>();
			while(rs.next()) {
				int idPage = rs.getInt("id");
				String titre = rs.getString("titre");
				
				listePagesPartagees.add(new Page(idPage, this.id, titre));
			}
			rs.close();
			st.close();
			connexion.close();
        } catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	protected static Utilisateur authentifier(String login, String mdp) {
		Utilisateur u = null;
		try {
			Connection connexion = DriverManager.getConnection(bdURL, bdLogin, bdPassword);
			String sql = " SELECT id, privilege"
					+ " FROM utilisateur"
					+ " WHERE login=? AND mot_de_passe = ?"
					+ ";";
			PreparedStatement pst = connexion.prepareStatement(sql);
			pst.setString(1, login);
			pst.setString(2, mdp);
			ResultSet rs = pst.executeQuery();
			while(rs.next()) {
				int id = rs.getInt("id");
				String privilegeSQL = rs.getString("privilege");
				Privilege privilege = null;
				if (privilegeSQL.equals("ADMIN")) privilege=Privilege.ADMIN;
				else if (privilegeSQL.equals("USER")) privilege=Privilege.USER;
				else if (privilegeSQL.equals("GUEST")) privilege=Privilege.GUEST;
				if(id != 0) {
					u = new Utilisateur(id, login, privilege);
				}
			}
			rs.close();
			pst.close();
			connexion.close();			
        } catch (SQLException e) {
			e.printStackTrace();
		}		
		return u;
	}
	
	public static Utilisateur inscrire(String login, String mdp) {
		Utilisateur u = null;
		try {
	        Connection connexion = DriverManager.getConnection(bdURL, bdLogin, bdPassword);
	        String sql = "SELECT id "
	        		+ " FROM utilisateur "
	        		+ " WHERE login = ?"
	        		+ ";";
	        PreparedStatement pst = connexion.prepareStatement(sql);
	        pst.setString(1, login);
	        ResultSet rs = pst.executeQuery();
	        
	        while(rs.next()) {
	        	rs.close();
	        	pst.close();
	        	connexion.close();
	        	return u;
	        }
	        
	        sql = "INSERT INTO utilisateur (login, mot_de_passe, privilege)"
	        		+ " VALUES (?, ?, 'USER')"
	        		+ ";";
	        pst = connexion.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
	        pst.setString(1, login);
	        pst.setString(2, mdp);
	        
	        int ri = pst.executeUpdate();	 
	        if (ri > 0) {
	        	rs = pst.getGeneratedKeys();
	        	while(rs.next()) {
	        		int id = rs.getInt(1);
	        		u = new Utilisateur(id, login, Privilege.USER);
	        	}
	        }
	        rs.close();
	        pst.close();
	        connexion.close();
		} catch (SQLException e) {
	        e.printStackTrace();
	    }
	    return u;
	}
	
	protected static ArrayList<Utilisateur> getListeUtilisateurs() {
		ArrayList<Utilisateur> listeUtilisateur = new ArrayList<>();
		try {
			Connection connexion = DriverManager.getConnection(bdURL, bdLogin, bdPassword);
			String sql = " SELECT id, login"
					+ " FROM utilisateur"
					+ ";";
			Statement st = connexion.createStatement();
			ResultSet rs = st.executeQuery(sql);
			
			while(rs.next()) {
				int id = rs.getInt("id");
				String login = rs.getString("login");
				
				Utilisateur u = new Utilisateur(id, login);
				listeUtilisateur.add(u);
			}
	        rs.close();
	        st.close();
	        connexion.close();
		} catch (SQLException e) {
	        e.printStackTrace();
	    }
	    return listeUtilisateur;
	}
}
