/**
 * 
 */
package view.vueSelectorDateChambre;

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.sql.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

import language.Francais;
import language.Language;

import tool.observable.EasyObserver;
import view.Formulaire;
import view.vuePlan.vueChambrePanel.ChambrePanel;
import database.dataset.Chambre;
import datechooser.beans.DateChooserPanel;
import datechooser.events.SelectionChangedEvent;
import datechooser.events.SelectionChangedListener;
import datechooser.model.multiple.Period;

/**
 * @author alexis
 *
 */
public class SelecteurDateChambre extends Formulaire implements EasyObserver, SelectionChangedListener{

	/**
	 * 
	 */
	private static final long serialVersionUID = -2302871194340293020L;
	private Map<ChambrePanel,ArrayList<Calendar>> selectedDate;
	private DateChooserPanel dateChooser;
	private GridBagConstraints constraint;
	private JPanel panelChambre,
				   content;
	private JLabel selectedDateLabel;
	private DateFormat df = new SimpleDateFormat("dd MMMM yyyy");
	private int[] chambreLineAmmount = {0,0,0,0};
	private JScrollPane scrollPane;
	private Language lang;
	
	/**
	 * constructeur
	 * @param chambres
	 */
	public SelecteurDateChambre(Language lang) {
		initVariable(lang);
		initComponents();
		initListener();
	}
	
	/**
	 * initiliase les variables
	 */
	private void initVariable(Language lang){
		this.lang = lang;
		
		selectedDate = new HashMap<ChambrePanel,ArrayList<Calendar>>();
		panelChambre = new JPanel(new GridBagLayout());
		dateChooser = new DateChooserPanel();
		constraint = new GridBagConstraints();
		scrollPane = new JScrollPane();
		content = new JPanel(new GridBagLayout());
		selectedDateLabel = new JLabel(lang.getPlanChambrepour()+df.format(new Date(Calendar.getInstance().getTimeInMillis())));
	}
	
	/**
	 * initialise les composents graphiques
	 * @param chambres
	 */
	private void initComponents(){
		scrollPane.setViewportView(panelChambre);
		scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
		
		dateChooser.setMinimumSize(dateChooser.getPreferredSize());
		
		constraint.anchor  = GridBagConstraints.NORTH;
		constraint.fill    = GridBagConstraints.NONE;
		constraint.insets  = new Insets(2, 2, 2, 2);
		constraint.weightx = 1.0;
		constraint.weighty = 1.0;
		constraint.gridx   = 0;
		constraint.gridy   = 0;
		content.add(dateChooser,constraint);
		
		constraint.anchor  = GridBagConstraints.NORTHWEST;
		constraint.fill    = GridBagConstraints.NONE;
		constraint.insets  = new Insets(2, 2, 2, 2);
		constraint.weightx = 1.0;
		constraint.weighty = 1.0;
		constraint.gridx   = 0;
		constraint.gridy   = 1;
		content.add(selectedDateLabel, constraint);
		
		constraint.anchor  = GridBagConstraints.SOUTH;
		constraint.fill    = GridBagConstraints.BOTH;
		constraint.weightx = 1.0;
		constraint.weighty = 1.0;
		constraint.gridx   = 0;
		constraint.gridy   = 2;
		content.add(scrollPane,constraint);
		
		constraint.anchor  = GridBagConstraints.NORTHWEST;
		constraint.fill    = GridBagConstraints.BOTH;
		constraint.weightx = 1.0;
		constraint.weighty = 1.0;
		constraint.gridx   = 0;
		constraint.gridy   = 0;
		add(content,constraint);
	}
	
	/**
	 * initialise les listener
	 */
	private void initListener(){
		dateChooser.addSelectionChangedListener(this);
	}
	
	public void addChambre(Chambre chambre, String nom, String prenom, Date prochaineDateLibre, int statut){
		ChambrePanel chambreAffichage = new ChambrePanel(chambre.getChambre_numero(),chambre.isChambre_devantlhotel());
		chambreAffichage.setNom(nom);
		chambreAffichage.setPrenom(prenom);
		chambreAffichage.setNextTimeFree(prochaineDateLibre);
		chambreAffichage.setStatus(statut);
		/*chambreAffichage.setSize(40,80);
		chambreAffichage.setMinimumSize(new Dimension(40,80));
		chambreAffichage.setMaximumSize(new Dimension(40,80));*/
		chambreAffichage.setPreferredSize(new Dimension(40,80));
		
		chambreAffichage.getObservable().addObserver(this);
		selectedDate.put(chambreAffichage, new ArrayList<Calendar>());
		
		constraint.anchor  = GridBagConstraints.NORTH;
		constraint.fill    = GridBagConstraints.BOTH;
		constraint.insets  = new Insets(2, 2, 2, 2);
		constraint.weightx = 1.0;
		constraint.weighty = 1.0;
		
		if(chambre.getChambre_nombreEtage() == 1)
		{
			if(chambre.isChambre_devantlhotel())
			{
				constraint.gridx   = chambreLineAmmount[0];
				constraint.gridy   = 0;
				
				panelChambre.add(chambreAffichage,constraint);
				
				chambreLineAmmount[0]++;
			}
			else
			{
				constraint.gridx   = chambreLineAmmount[1];
				constraint.gridy   = 1;
				
				panelChambre.add(chambreAffichage,constraint);
				
				chambreLineAmmount[1]++;
			}
		}
		else
		{
			if(chambre.isChambre_devantlhotel())
			{
				constraint.gridx   = chambreLineAmmount[2];
				constraint.gridy   = 2;
				
				panelChambre.add(chambreAffichage,constraint);
				
				chambreLineAmmount[2]++;
			}
			else
			{
				constraint.gridx   = chambreLineAmmount[3];
				constraint.gridy   = 3;
				
				panelChambre.add(chambreAffichage,constraint);
				
				chambreLineAmmount[3]++;
			}
		}
		scrollPane.setPreferredSize(new Dimension(scrollPane.getComponent(0).getPreferredSize().width + scrollPane.getVerticalScrollBar().getPreferredSize().width,scrollPane.getComponent(0).getPreferredSize().height + scrollPane.getHorizontalScrollBar().getPreferredSize().width));
		scrollPane.setMinimumSize(new Dimension(500,300));
		
		panelChambre.invalidate();
		panelChambre.revalidate();
		panelChambre.repaint();
		scrollPane.invalidate();
		scrollPane.revalidate();
		scrollPane.repaint();
		this.revalidate();
		this.repaint();
	}
	
	public void clearChambre(){
		panelChambre.removeAll();
		selectedDate.clear();
		chambreLineAmmount[0] = 0;
		chambreLineAmmount[1] = 0;
		chambreLineAmmount[2] = 0;
		chambreLineAmmount[3] = 0;
		scrollPane.invalidate();
		scrollPane.revalidate();
		scrollPane.repaint();
		this.revalidate();
		this.repaint();
	}
	
	/**
	 * initialise the chambers
	 * @param chambre
	 */
	public void setChambre(Chambre[] chambre){
		/*if(isChambreSet == false)
		{
			constraint.anchor  = GridBagConstraints.NORTH;
			constraint.fill    = GridBagConstraints.NONE;
			constraint.insets  = new Insets(10, 3, 10, 3);
			constraint.weightx = 1.0;
			constraint.weighty = 1.0;
			constraint.gridx   = 1;
			constraint.gridy   = 0;
			
			JPanel chambreLayout = new JPanel();selectedDate
			chambreLayout.setLayout(new GridLayout(4,16,5,5));
			
			ArrayList<ArrayList<ChambrePanel>> visuelChambre = new ArrayList<ArrayList<ChambrePanel>>();
			for(int i = 0; i < 4; i++)
			{
				visuelChambre.add(new ArrayList<ChambrePanel>());
			}
			
			for(int i = 0; i < chambre.length; i++)
			{
				ChambrePanel temp = new ChambrePanel(chambre[i].getChambre_numero(),chambre[i].isChambre_devantlhotel());//"A","B",Calendar.getInstance(),1);
				temp.getObservable().addObserver(this);
				selectedDate.put(temp, new ArrayList<Calendar>());
				temp.setNom("A");
				temp.setPrenom("B");
				//temp.setNextTimeFree(Calendar.getInstance());
				temp.setStatus(1);
				temp.setSize(40,80);
				temp.setMinimumSize(new Dimension(40,80));
				temp.setMinimumSize(new Dimension(40,80));
				temp.setPreferredSize(new Dimension(40,80));
				
				if(chambre[i].getChambre_nombreEtage() == 1)
				{
					if(chambre[i].isChambre_devantlhotel())
					{
						visuelChambre.get(0).add(temp);
					}
					else
					{
						visuelChambre.get(1).add(temp);
					}
				}
				else
				{
					if(chambre[i].isChambre_devantlhotel())
					{
						visuelChambre.get(2).add(temp);
					}
					else
					{
						visuelChambre.get(3).add(temp);
					}
				}
			}
			
			for(int i = 0; i < 4; i++)
			{
				for(int j = 16; j > 0; j--)
				{
					if(j - visuelChambre.get(i).size() > 0)
					{
						JPanel tempPane = new JPanel();
						tempPane.setSize(60,80);
						tempPane.setPreferredSize(new Dimension(60,80));
						chambreLayout.add(tempPane);
					}
					else
					{
						chambreLayout.add(visuelChambre.get(i).get(j-1));
					}
				}
			}
			content.add(chambreLayout,constraint);
			
			isChambreSet = true;
		}*/
	}
	
	public Date getDebut(){
		return new Date(dateChooser.getSelectedPeriodSet().getLastAddedPeriod().getStartDate().getTimeInMillis());
	}
	
	public Date getFin(){
		return new Date(dateChooser.getSelectedPeriodSet().getLastAddedPeriod().getEndDate().getTimeInMillis());
	}
	
	public List<Date> getSelectedDateForChambre(int ID){
		ArrayList<Calendar> listSelectedCalendar = null;
		List<Date> listSelectedDate = new ArrayList<Date>();
		
		for(Entry<ChambrePanel,ArrayList<Calendar>> entry : selectedDate.entrySet())
		{
			if(entry.getKey().getID() == ID)
			{
				listSelectedCalendar = entry.getValue();
				break;
			}
		}
		if(listSelectedCalendar == null)
		{
			return new ArrayList<Date>();
		}
		for(int i = 0; i < listSelectedCalendar.size(); i++)
		{
			listSelectedDate.add(new Date(listSelectedCalendar.get(i).getTimeInMillis()));
		}

		return listSelectedDate;
	}
	
	public void setSelectedDateForChambre(int ID, List<Date> listSelectedDate){
		ArrayList<Calendar> listSelectedCalendar = null;
		ChambrePanel cham = null;
		
		for(Entry<ChambrePanel,ArrayList<Calendar>> entry : selectedDate.entrySet())
		{
			if(entry.getKey().getID() == ID)
			{
				listSelectedCalendar = entry.getValue();
				cham = entry.getKey();
				break;
			}
		}
		if(listSelectedCalendar == null)
		{
			return;
		}
		
		listSelectedCalendar.clear();
		
		for(int i = 0; i < listSelectedDate.size(); i++)
		{
			Calendar cal = Calendar.getInstance();
			cal.setTimeInMillis(listSelectedDate.get(i).getTime());
			listSelectedCalendar.add(cal);
			if(dateChooser.getSelectedPeriodSet().contains(cal))
				cham.setSelected(true);
		}
	}
	
	@Override
	public void update(Object observable, Object obj) {
		if(obj instanceof ChambrePanel)
		{
			Iterable<Calendar> intCalendar = dateChooser.getSelectedPeriodSet().getDates();
			for (Calendar var : intCalendar) 
			{
				for(int i = 0; i < selectedDate.get((ChambrePanel)obj).size(); i++)
				{
					if(selectedDate.get((ChambrePanel)obj).get(i).equals(var))
					{
						selectedDate.get((ChambrePanel)obj).remove(i);
						((ChambrePanel) obj).setSelected(false);
						return;
					}
				}
				selectedDate.get((ChambrePanel)obj).add((Calendar) var.clone());
				((ChambrePanel) obj).setSelected(true);
			}
		}
	}
	
	@Override
	public void onSelectionChange(SelectionChangedEvent arg0) {
		for (Entry<ChambrePanel, ArrayList<Calendar>> entry : selectedDate.entrySet())
		{
			ChambrePanel temp = entry.getKey();
			if(selectedDate.get(temp).contains(dateChooser.getSelectedDate()))
				temp.setSelected(true);
			else
				temp.setSelected(false);
		}
		
		String text = lang.getPlanChambrepour();
		Iterable<Period> periods = dateChooser.getSelectedPeriodSet().getPeriods();
		for(Period peri : periods)
		{
			if(!text.equals(lang.getPlanChambrepour())){
				text += lang.getPlanEt();
			}
			text += df.format(new Date(peri.getStartDate().getTimeInMillis()));
			if(peri.getStartDate().getTimeInMillis() != peri.getEndDate().getTimeInMillis())
				text += lang.getPlanAu() + df.format(new Date(peri.getEndDate().getTimeInMillis()));
		}
		
		
		selectedDateLabel.setText(text);
		/*call controler*/
		getObservable().notifyObservers(obtenirMessage("SelectionDate"));
	}

	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		JFrame a = new JFrame();
        SelecteurDateChambre select = new SelecteurDateChambre(Francais.getInstance());
        java.util.Date today = new java.util.Date();
        java.sql.Date sqlToday = new java.sql.Date(today.getTime());

		a.add(select);
		for(int i = 0; i < 16;i++)
		{
			select.addChambre(new Chambre(1,2, true,1,"", 101+i), "bob", "name", sqlToday, 1);
		}
		select.clearChambre();
		for(int i = 16; i < 32;i++)
		{
			select.addChambre(new Chambre(1,2, false,1,"", 101+i), "bob", "name", sqlToday, 1);
		}
		for(int i = 32; i < 48;i++)
		{
			select.addChambre(new Chambre(1,2, true,2,"", 101+i), "bob", "name", sqlToday, 1);
		}
		for(int i = 48; i < 64;i++)
		{
			select.addChambre(new Chambre(1,2, false,2,"", 101+i), "bob", "name", sqlToday, 1);;
		}
		for(int i = 0; i < 24;i++)
		{
			select.addChambre(new Chambre(1,2, true,1,"", 101+i), "bob", "name", sqlToday, 1);
		}
        a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //select.setChambre(chamb);
         /*JPanel b = new JPanel(new BorderLayout());
         b.add(select,BorderLayout.CENTER);*/
        a.setSize(a.getToolkit().getScreenSize());
        a.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        a.setExtendedState(JFrame.MAXIMIZED_BOTH);
        a.pack();
        a.setVisible(true);
	}
}
