/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package view.tool.dateField;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.sql.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.text.Document;

import tool.observable.EasyObserver;
import view.tool.inputField.JValidTextField;

/**
 *
 * @author alexis
 */
public class DateField extends JPanel implements EasyObserver, ActionListener, FocusListener {
	/*properties*/
	private static final long serialVersionUID = 4857034260714237578L;
    private JValidTextField input;
    private DatePanel datePanel;
    private JFrame popUp;
    private static final int DIALOG_WIDTH = 200;
    private static final int DIALOG_HEIGHT = 200;
    private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    private boolean isValid = false;
    private final Pattern dateRegex = Pattern.compile("^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$");
    
    /*constructeur*/
    /**
     * constructeur
     * @param _cal as calendar
     */
    private DateField(Calendar _cal){
    	super(new BorderLayout());
        popUp = new JFrame();
        input = JValidTextField.JValidTextFieldWithTextAllowCertainCharacter("[0-9-]", format.format(_cal.getTime()),7);
        
        datePanel = DatePanel.DatePanelEditableAtDate(_cal);
        input.addFocusListener(this);
        add(input,BorderLayout.CENTER);
        add(createIcon(),BorderLayout.EAST);
        
        popUp.add(datePanel);
        popUp.setSize(DIALOG_WIDTH,DIALOG_HEIGHT);
    }
    
    public static DateField fromString(String date) throws ParseException{
		Calendar cal = Calendar.getInstance();
		cal.setTime(format.parse(date));
    	return new DateField(cal);
    }
    
    public static DateField fromCalendar(Calendar cal){
    	return new DateField(cal);
    }
    
    /*methode privée*/
    /**
     * private factory
     * @return JButton
     */
    private JButton createIcon(){
        JButton image = new JButton();
        ImageIcon icon = new ImageIcon(this.getClass().getResource("calendar_icon.png"));
        image.setIcon(icon);
        image.setPreferredSize(new Dimension(20, 20));
        image.addActionListener(this);
        
        return image;
    }
    
    /**
     * private method
     * affiche un calendrier popup
     * @param position as Point
     */
    private void showDatePopUpCalendar(Point position) {
        popUp.setLocation(position);
        popUp.setVisible(true);
    }
    
    /*getter*/
    /**
     * getter de date
     * @return Date
     */
	public Date getDate() {
       return Date.valueOf(input.getText());
    }
	
	/**
	 * @return document of the input field
	 */
	public Document getDocument() {
		return input.getDocument();
	}
    
    /*setter*/
	/**
     * setter de date
     * @param date as Date
     */
    public void setDate(String date){
        input.setText(date);
    }
    
    /**
     * setter de date
     * @param date as Date
     */
    public void setDate(Date date){
        input.setText(format.format(date));
    }
    
    public boolean isValid(){
    	return isValid;
    }

    /*implement observer*/
    @Override
    public void update(Object obs, Object calendar) {
        input.setText(format.format(((Calendar)calendar).getTime()));
        datePanel.getObservable().deleteObserver(this);
        popUp.setVisible(false);
    }

    /*implement action listener*/
    @Override
    public void actionPerformed(ActionEvent arg0) {
        datePanel.getObservable().addObserver(this);
        Point point = getLocationOnScreen();
        point.y = point.y + 30;
        showDatePopUpCalendar(point);
    }

    /*implement focusListener*/
    @Override
    public void focusGained(FocusEvent arg0) {}

    @Override
    public void focusLost(FocusEvent arg0) {
        Matcher dateMatcher = dateRegex.matcher(input.getText());
        if(!dateMatcher.find())
        {
        	isValid = false;
        	input.setBackground(Color.RED);
        }
        else
        {
        	isValid = true;
        	input.setBackground(Color.WHITE);
        }
    }
}
