package fr.iutfbleau.projetIHM2021FI2.Model;

import java.sql.*;
import java.sql.Date;
import java.time.LocalDate;
import fr.iutfbleau.projetIHM2021FI2.API.*;
import java.util.*;

import javax.swing.JOptionPane;

/**
 * La classe RecupChambre nous permet de récupérer et traiter les chambres grâce à la base de données.
 *  
 * @version 1.0
 * @author Anice TAJGALT, Gianni MANZARI, Alban DUMAS
 */

public class RecupChambre implements Chambre {
    private int numero;
    private TypeChambre type;

    public RecupChambre(int numero, TypeChambre t){
        Objects.requireNonNull(t,"Type de chambre est null.");
        this.numero=numero;
        this.type=t;
    }


    public int getNumero(){
        return this.numero;
    }
    

    public boolean unLitSimple(){
        //https://stackoverflow.com/questions/1750435/comparing-java-enum-members-or-equals
        return (this.type == TypeChambre.UNLS);
    }


    public boolean deuxLitsSimples(){
        return (this.type == TypeChambre.DEUXLS);
    }


    public boolean unLitDouble(){
        return (this.type == TypeChambre.UNLD);
    }


    public TypeChambre getType(){
        return this.type;
    }


    static public RecupChambre byDate(LocalDate date) {
		RecupChambre room = null;

		try {
			PreparedStatement pst = ConnexionBDD.getInstance().getSQLco().prepareStatement(
			"SELECT id, type FROM Chambre WHERE DATEDIFF(?, dateDispo) > 0");

			pst.setDate(1, Date.valueOf(date));
			pst.executeUpdate();
			ResultSet rs = pst.executeQuery();

			rs.next();
            //          CREATION CHAMBRE
			room = new RecupChambre(rs.getInt("id"), TypeChambre.values()[rs.getInt("type") - 1]);
			rs.close();
			pst.close();
		}
		catch(SQLException e) {
			System.err.println("erreur bydate");
			System.out.println("error code " + e.getErrorCode());
			System.out.println(" sqlState " + e.getSQLState());
		}
		return room;
	}

    static public ArrayList<RecupChambre> allByDate(LocalDate date) {
		ArrayList<RecupChambre> rooms = new ArrayList<RecupChambre>();

		try {
			PreparedStatement pst = ConnexionBDD.getInstance().getSQLco().prepareStatement(
			"SELECT id, type FROM Chambre WHERE DATEDIFF(?, dateDispo) > 0");

			pst.setDate(1, Date.valueOf(date));
			pst.executeUpdate();
			ResultSet rs = pst.executeQuery();

			while (rs.next()) {
				rooms.add(new RecupChambre(rs.getInt("id"), TypeChambre.values()[rs.getInt("type") - 1]));
			}
			rs.close();
			pst.close();
		}
		catch(SQLException e) {
			System.err.println("Aucune chambre à partir de cette date là");
		}

		return rooms;
	}

    public void reserve(LocalDate date) {
        try {
			PreparedStatement pst = ConnexionBDD.getInstance().getSQLco().prepareStatement(
			"UPDATE Chambre SET dateDispo = ? WHERE id = ?;");

			pst.setDate(1, Date.valueOf(date));
            pst.setInt(2, this.getNumero());
			pst.executeUpdate();
            pst.executeQuery();

            JOptionPane.showMessageDialog(null, "La chambre " + this.getNumero() + " a été réservée pour le " + date + " avec succès !", "Réservation", JOptionPane.INFORMATION_MESSAGE);
		}
		catch(SQLException e) {
			System.err.println("Impossible de réserver la chambre");
		}
    }
}
