package database.migration.etape3.reservationVente;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Time;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import database.dataset.Article;
import database.dataset.Categorie_article;
import database.dataset.Facture;
import database.dataset.Location_chambre;
import database.dataset.Reservation;
import database.dataset.Reservation_groupe;
import database.dataset.Reservation_individu;
import database.dataset.Vente;
import database.dataset.Vente_article;
import database.migration.SqlFactory;
import database.migration.etape0.categorie_article.ReadCategorieStock;
import database.migration.etape1.article.ReadStock;
import database.migration.etape1.chambre_reserv_reparation.ReadChambre;


/**
 * @author martin
 * prealablement lire Facture, Chambre et Stock
 */
public class ReadVente {
	private final Vente _vente;
	private final Reservation _reservation;

	public ReadVente(Vente _vente, Reservation _reservation) {
		super();
		this._vente = _vente;
		this._reservation = _reservation;
	}

	private static Article trouverArticleParID(int id, Set<Article> articles){
		for (Article article : articles){
			if (article.getarticle_p_id() == id){
				return article;
			}
		}
		return null;
	}
	
	private static Categorie_article trouverCategorieParID(int id, Set<Categorie_article> cats){
		for (Categorie_article cat : cats){
			if (cat.getcategorie_article_p_id()==id)
				return cat;
		}
		return null;
	}
	
	private static Facture trouverFactureParID(int id, Set<Facture> set){
		for (Facture facture : set)
			if (facture.getFacture_p_id()==id)
				return facture;
		return null;
	}
	
	public static List<ReadVente> from(Connection connection) throws SQLException{
		System.out.println("preimport chambre");
		Set<Reservation> _reservation = ReadChambre.normaliseReservation(ReadChambre.from(connection));
		
		System.out.println("import vente");
		//preparation
//		System.out.println("besoin des articles et categori article");
		Set<Article> articles = ReadStock.from(connection);
		Set<Categorie_article> categories = ReadCategorieStock.from(connection);
		

		int reservationID = 0;
		for (Reservation r : _reservation)
			if (r.getReservation_p_id()>reservationID)
				reservationID = r.getReservation_p_id();
		reservationID++;
		
		//lecture des ventes
//		System.out.println("commencon");
		List<ReadVente> venteLst = new ArrayList<>();
		Statement stm = connection.createStatement();
		ResultSet rs = stm.executeQuery("SELECT * FROM ventes, facture WHERE facture.ID=ID_facture");
		while(rs.next()){
			int id = rs.getInt("ID"),
				id_facture = rs.getInt("ID_facture"),
				id_stock = rs.getInt("ID_stock"),
				id_chambre = rs.getInt("ID_chambre"),
				quantite = rs.getInt("quantite"),
				ID_status_facture = rs.getInt("ID_statut"),
				ID_client_facture = rs.getInt("ID_client");
			String dateStr = rs.getString("date");
			BigDecimal prix = rs.getBigDecimal("prix");
			Date jour = Date.valueOf(dateStr);
			Time heure = Time.valueOf("03:23:22");


			Vente vente = null;
			Reservation reservation = null;
			reservationID++;
			
//			System.out.print("importation vente " + id);
			
			//determiner si c'est une vente d'article ou une location
			//aussi si c'est une location determiner si
			//c'est une reservation groupe ou une reservation individu
			Article article = trouverArticleParID(id_stock, articles);
			Categorie_article cat = null;
			if (article==null){
				//dans le cas d'un article inconnu
				//cela corromperai la BD
				//voir quoi faire avec
				vente = new Vente(id, 
						          heure, 
						          jour, 
						          prix, 
						          id_facture, 
						          id_stock);
//				System.out.println(" article");
			}
			else{
				cat = trouverCategorieParID(article.getCategorie_fk_id(), categories);
				if (id_chambre!=0 && cat!=null && cat.getCategorie_article_description().equals("CHAMBRE")){
					vente = new Location_chambre(id, 
	                                             jour, 
	                                             heure, 
	                                             prix, 
	                                             id_facture, 
	                                             id_stock, 
	                                             reservationID);
					reservation = new Reservation_individu(reservationID, 
							                             id_chambre, 
							                             jour, 
							                             jour, 
							                             "IMPORTATION ANCIENNE BD", 
							                             ID_status_facture, 
							                             ID_client_facture);
					reservationID++;
//					System.out.println(" reservation individu");
				}
				else if (id_chambre!=0 && cat!=null && cat.getCategorie_article_description().equals("GROUPE")){
					vente = new Location_chambre(id,
												 jour,
	                                             heure,
	                                             prix, 
	                                             id_facture, 
	                                             id_stock, 
	                                             reservationID);
					reservation = new Reservation_groupe(reservationID, 
                            id_chambre, 
                            jour, 
                            jour, 
                            "IMPORTATION ANCIENNE BD", 
                            ID_status_facture, 
                            ID_client_facture);
					reservationID++;
//					System.out.println(" reservation groupe");
				}
				else{
					vente = new Vente_article(id, 
							                  heure, 
							                  jour, 
							                  prix, 
							                  id_facture, 
							                  id_stock, 
							                  quantite);
//					System.out.println(" tout court");
				}
			}
			/**/
			venteLst.add(new ReadVente(vente, 
	                                   reservation));
		}
		
		return venteLst;
	}
	
	public Vente get_vente() {
		return _vente;
	}

	public Reservation get_reservation() {
		return _reservation;
	}

	public static void main(String...strings) throws FileNotFoundException, SQLException, IOException{
		Connection connection = SqlFactory.connect(SqlFactory.loadProperties("hotel_orford_import.xml"));
		
		for (ReadVente a : from(connection)){
			System.out.println(a._vente.toString());
			if (a._reservation!=null)
				System.out.println(a._reservation.toString());
		}
		
		System.out.println("bonne journée");
	}
}
