/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package ro.nextreports.designer.util;

import org.jdesktop.swingx.JXDatePicker;

import javax.swing.*;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.awt.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Calendar;

/**
 * User: mihai.panaitescu
 * Date: 14-Dec-2009
 * Time: 17:38:13
 */
public class JDateTimePicker extends JPanel {

    private JXDatePicker datePicker;
    JSpinner minSpinner;
    JSpinner hourSpinner;

    private static final String mins[] = createTimeString(60);
    private static final String hours[] = createTimeString(24);

    public static final String uiClassID = "DateTimePickerUI";

    static DateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm");

    public JDateTimePicker() {
    	super();
    	createPanel();
    }

    private void createPanel() {

        setLayout(new GridBagLayout());

        datePicker =new JXDatePicker();
        datePicker.addPropertyChangeListener(new PropertyChangeListener() {
   	     public void propertyChange(PropertyChangeEvent e) {
	         if ("date".equals(e.getPropertyName())) {
	        	 onChange();
	         }
	     }
	 });

        SpinnerListModel hourModel = new SpinnerListModel(createTimeString(24));
        hourSpinner = new JSpinner(hourModel);
        hourSpinner.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent e) {
                changeDate();
            }
        });

        SpinnerListModel minModel = new SpinnerListModel(createTimeString(60));
        minSpinner = new JSpinner(minModel);
        minSpinner.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent e) {
                changeDate();
            }
        });

        add(datePicker, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST,
                    GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
        add(hourSpinner, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST,
                    GridBagConstraints.NONE, new Insets(5, 0, 5, 2), 0, 0));
        add(new JLabel(":"), new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST,
                    GridBagConstraints.NONE, new Insets(5, 0, 5, 0), 0, 0));
        add(minSpinner, new GridBagConstraints(3, 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST,
                    GridBagConstraints.NONE, new Insets(5, 2, 5, 5), 0, 0));
        add(new JLabel(""), new GridBagConstraints(4, 0, 1, 1, 1.0, 0.0, GridBagConstraints.WEST,
                    GridBagConstraints.HORIZONTAL, new Insets(5, 0, 5, 0), 0, 0));

    }

    private static String[] createTimeString(int time) {
        String[] retString = new String[time];
        for (int i = 0; i < retString.length; i++) {
            String timeS = "";

            if (i < 10)
                timeS = "0";
            timeS += Integer.toString(i);
            retString[i] = timeS;
        }
        return retString;
    }

    private void changeDate() {
    	// do not change the date with every spinner because this fires many events
    	// better use an apply or ok button

        Date date = getDate();
        if (date != null) {
            datePicker.setDate(date);
            int hours = Integer.parseInt((String) hourSpinner.getValue());
            int min = Integer.parseInt((String) minSpinner.getValue());

            GregorianCalendar calendar = new GregorianCalendar();
            calendar.setTime(date);
            // use set instead of add to set the time values
            calendar.set(Calendar.HOUR_OF_DAY, hours);
            calendar.set(Calendar.MINUTE, min);
            calendar.set(Calendar.SECOND, 0);
            calendar.set(Calendar.MILLISECOND, 0);

            Date newDate = calendar.getTime();            
            setDate(newDate);
            onChange();
        }
    }

    public Date getDate() {
    	Date date = datePicker.getDate();
    	if (date != null) {
    		int hours = Integer.parseInt((String) hourSpinner.getValue());
    		int min = Integer.parseInt((String) minSpinner.getValue());
    		GregorianCalendar calendar = new GregorianCalendar();
    		calendar.setTime(date);
    		// use set instead of add to set the time values
    		calendar.set(Calendar.HOUR_OF_DAY, hours);
    		calendar.set(Calendar.MINUTE, min);
    		calendar.set(Calendar.SECOND, 0);
    		calendar.set(Calendar.MILLISECOND, 0);

    		date = calendar.getTime();
    	}
    	return date;
    }

    public void setDate(Date date) {
    	if (date != null) {
            datePicker.setDate(date);
            GregorianCalendar calendar = new GregorianCalendar();
			calendar.setTime(date);
			int hour = calendar.get(Calendar.HOUR_OF_DAY);
			int min = calendar.get(Calendar.MINUTE);
			System.out.println("Set the date, hours: "+hour+"("+hours[hour]+"), mins: "+min+"("+mins[min]+")");
			try {
		    	hourSpinner.setValue(hours[hour]);
		    	minSpinner.setValue(mins[min]);
			}catch (Exception e) {
				e.printStackTrace();
			}
    	}
    }

    public JXDatePicker getDatePicker() {
        return datePicker;
    }
    
    protected void onChange() {    	
    }


}