/**
 * 
 */
package view;

import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.IOException;
import java.sql.Date;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSeparator;

import language.Francais;
import language.Language;
import view.FactoryPrincipale.PrincipaleGestionFactory;
import view.aide.HelpButton;

/**
 * @author alexis
 *
 */
public class Fenetre extends JFrame implements ActionListener, WindowListener{

	/**
	 * 
	 */
	private static final long serialVersionUID = -8951321134861121196L;
	private GridBagConstraints constraint;
	private JLabel labelNom,
				   labelDate;
	private JButton buttonDeconnexion;
	private HelpButton buttonAide;
	private OngletSuperieur principe;
	private JPanel panelEntete,
				   panelButton;
	private JSeparator separator;
	private Language lang;
	
	public Fenetre(Language lang,String nom) throws IOException {
		setLayout(new GridBagLayout());
		initVariable(lang,nom);
		initComponents();
		initListener();
	}
	
	private void initVariable(Language _lang, String nom) throws IOException{
		lang = _lang;
		
		principe = new OngletSuperieur();
		
		constraint = new GridBagConstraints();
		labelNom = new JLabel(nom);
		
		java.util.Date now = new java.util.Date();
		labelDate = new JLabel(new java.sql.Date(now.getTime()).toString());
		
		buttonDeconnexion = new JButton(lang.getFenetreDeconnexion());
		buttonAide        = new HelpButton(lang);
		
		panelEntete = new JPanel(new GridBagLayout());
		panelButton = new JPanel(new FlowLayout(FlowLayout.RIGHT));
		
		separator = new JSeparator();
		
		setSize(getToolkit().getScreenSize());
		setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		
		setExtendedState(JFrame.MAXIMIZED_BOTH);
		//pack();
		validate();
		setVisible(true);
	}
	
	private void initComponents(){
		constraint.fill = GridBagConstraints.NORTHWEST;
		constraint.fill = GridBagConstraints.HORIZONTAL;
		constraint.insets  = new Insets(3, 3, 3, 3);
		constraint.weightx = 1.0;
		constraint.weighty = 0.0;
		constraint.gridx = 0;
		constraint.gridy = 0;
		panelEntete.add(labelNom, constraint);
		
		JPanel centerWrap = new JPanel(new FlowLayout(FlowLayout.CENTER));
		centerWrap.add(labelDate);

		constraint.fill = GridBagConstraints.CENTER;
		constraint.fill = GridBagConstraints.HORIZONTAL;
		constraint.weightx = 1.0;
		constraint.weighty = 0.0;
		constraint.gridx = 1;
		constraint.gridy = 0;
		panelEntete.add(centerWrap, constraint);
		
		panelButton.add(buttonDeconnexion);
		panelButton.add(buttonAide);
		
		constraint.fill = GridBagConstraints.NORTHEAST;
		constraint.fill = GridBagConstraints.HORIZONTAL;
		constraint.weightx = 1.0;
		constraint.weighty = 0.0;
		constraint.gridx = 2;
		constraint.gridy = 0;
		panelEntete.add(panelButton, constraint);
		
		constraint.fill = GridBagConstraints.HORIZONTAL;
		constraint.insets  = new Insets(0, 3, 0, 3);
		constraint.weightx = 1.0;
		constraint.weighty = 0.0;
		constraint.gridx = 0;
		constraint.gridy = 1;
		constraint.gridwidth = 3;
		panelEntete.add(separator, constraint);
		
		constraint.fill = GridBagConstraints.HORIZONTAL;
		constraint.weightx = 0.0;
		constraint.weighty = 0.0;
		constraint.gridx = 0;
		constraint.gridy = 0;
		add(panelEntete, constraint);
		
		constraint.fill = GridBagConstraints.BOTH;
		constraint.weightx = 1.0;
		constraint.weighty = 1.0;
		constraint.gridx = 0;
		constraint.gridy = 1;
		add((Component)principe, constraint);
	}
	
	private void initListener(){
		buttonDeconnexion.addActionListener(this);
		this.addWindowListener(this);
	}
	
	public void setEnteteVisible(boolean isVisible){
		panelEntete.setVisible(isVisible);
	}
	
	public void setPrincipale(OngletSuperieur _principe){
		this.remove((Component)principe);
		principe = _principe;
		
		constraint.fill = GridBagConstraints.BOTH;
		constraint.weightx = 1.0;
		constraint.weighty = 1.0;
		constraint.gridx = 0;
		constraint.gridy = 1;
		add((Component)principe, constraint);
		
		this.revalidate();
		this.repaint();
	}
	
	public OngletSuperieur getPrincipale(){
		return (OngletSuperieur) principe;
	}
	
	public Language getLanguage(){
		return lang;
	}
	
	public void setDate(Date sqlDate){
		labelDate.setText(sqlDate.toString());
	}		
	
	public Date getDate(){
		return Date.valueOf(labelDate.getText());
	}
	
	public void setNom(String nom){
		labelNom.setText(nom);
	}
	
	public String getNom(){
		return labelNom.getText();
	}
	
	@Override
	public void actionPerformed(ActionEvent arg0) {
	}

	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		Fenetre a = new Fenetre(Francais.getInstance(),"Denise Rivard");
		a.setPrincipale(new PrincipaleGestionFactory().build(Francais.getInstance()));
		/*a.setPrincipale(PrincipaleReceptionFactory.build(Francais.getInstance()));

		a.setNom("Billy");
		a.setPrincipale(new PrincipaleSpectateurFactory().build(Francais.getInstance()));
		a.setEnteteVisible(false);*/
	}

	@Override
	public void windowActivated(WindowEvent arg0) {}

	@Override
	public void windowClosed(WindowEvent arg0) {}

	@Override
	public void windowClosing(WindowEvent arg0) {
		/* REMOVE THIS LINE TO ADD THE CONFIRMATION MESSAGE ON CLOSING */
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		System.exit(0);
		/*
		//Display confirm dialog
        int confirmed = JOptionPane.showConfirmDialog(this,
                "Are you sure you want to quit?", "Confirm Quit",
                JOptionPane.YES_NO_OPTION);
       
        //Close if user confirmed
        if (confirmed == JOptionPane.YES_OPTION)
        {                            
                //Close frame
                System.exit(0);
        } */
	}

	@Override
	public void windowDeactivated(WindowEvent arg0) {}

	@Override
	public void windowDeiconified(WindowEvent arg0) {}

	@Override
	public void windowIconified(WindowEvent arg0) {}

	@Override
	public void windowOpened(WindowEvent arg0) {}
}