//    uniCenta oPOS  - Touch Friendly Point Of Sale
//    Copyright (c) 2009-2018 uniCenta & previous Openbravo POS works
//    https://unicenta.com
//
//    This file is part of uniCenta oPOS
//
//    uniCenta oPOS is free software: you can redistribute it and/or modify
//    it under the terms of the GNU General Public License as published by
//    the Free Software Foundation, either version 3 of the License, or
//    (at your option) any later version.
//
//   uniCenta oPOS is distributed in the hope that it will be useful,
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//    GNU General Public License for more details.
//
//    You should have received a copy of the GNU General Public License
//    along with uniCenta oPOS.  If not, see <http://www.gnu.org/licenses/>.

package com.unicenta.beans;

import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 *
 * @author JG uniCenta
 */
public class JClockPanel extends javax.swing.JPanel {
    
    private static Calendar m_calendar = new GregorianCalendar(); // solo de ayuda...
    
    private Date m_date;
    private boolean m_bSeconds;
    private long m_lPeriod;
    
    /** Creates new form JClockPanel */
    public JClockPanel() {
        this(true);
    }
    
    /**
     *
     * @param bSeconds
     */
    public JClockPanel(boolean bSeconds) {
        
        initComponents();
        
        m_bSeconds = bSeconds;
        m_date = null;
        m_lPeriod = 0L;
    }
    
    /**
     *
     * @param bValue
     */
    public void setSecondsVisible(boolean bValue) {
        m_bSeconds = bValue;
        repaint();
    }

    /**
     *
     * @return
     */
    public boolean isSecondsVisible() {
        return m_bSeconds;
    }

    /**
     *
     * @param period
     */
    public void setPeriod(long period) {
        if (period >= 0L) {
            m_lPeriod = period;
            repaint();
        }
    }

    /**
     *
     * @return
     */
    public long getPeriod() {
        return m_lPeriod;
    }
    
    /**
     *
     * @param dDate
     */
    public void setTime(Date dDate){
        m_date = dDate;
        repaint();
    }
    
    /**
     *
     * @return
     */
    public Date getTime() {
        return m_date;
    }
    
    @Override
    public void paintComponent(Graphics g) {
        
        super.paintComponent(g);
        
        int width = getWidth();
        int height = getHeight();
        
        double dhour = 0.0;
        double dminute = 0.0;
        double dsecond = 0.0;
            
        // Calculo los atributos de la hora que voy a pintar
        if (m_date != null) {            
            m_calendar.setTime(m_date);
            dhour = (double) m_calendar.get(Calendar.HOUR_OF_DAY);
            dminute = (double) m_calendar.get(Calendar.MINUTE);
            dsecond = (double) m_calendar.get(Calendar.SECOND);
        }
        
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        
        // guardo los valores iniciales
        Paint oldPainter = g2.getPaint();
        AffineTransform oldt = g2.getTransform();

        // pinto el fondo
//        g2.setPaint(new GradientPaint(0, 0, Color.WHITE, width, 0, Color.LIGHT_GRAY));
//        g2.fill(g2.getClip());
        
        // Calculo el centro y el tamano del reloj
        int icenterx = width / 2;
        int icentery = height / 2;
        int iradius = Math.min(icenterx, icentery);        
        
        // Centro las coordenadas y ajusto la transformacion del tamano del reloj
        g2.transform(AffineTransform.getTranslateInstance(icenterx, icentery));
        g2.transform(AffineTransform.getScaleInstance(iradius / 1100.0 , iradius / 1100.0));       
        AffineTransform mytrans = g2.getTransform();
        
        // Pinto la esfera del reloj;
        g2.setPaint(this.isEnabled() 
            ? new GradientPaint(-1200, -1200, Color.BLUE, 1200, 1200, Color.CYAN)
            : new GradientPaint(-1200, -1200, Color.GRAY, 1200, 1200, Color.LIGHT_GRAY));
        g2.fillOval(-1000, -1000, 2000, 2000);
        g2.setPaint(this.isEnabled()
            ? new GradientPaint(-1200, -1200, Color.CYAN, 1200, 1200, Color.BLUE)
            : new GradientPaint(-1200, -1200, Color.LIGHT_GRAY, 1200, 1200, Color.GRAY));
        g2.fillOval(-900, -900, 1800, 1800);
        g2.setColor(Color.BLACK);
        g2.drawOval(-1000, -1000, 2000, 2000);       
        
        // Pinto las marcas pequenas, los minutos
        for (int i = 0; i < 60; i++) {
            g2.setColor(Color.WHITE);
            g2.fillRect(900, -5 , 50, 10);
            g2.transform(AffineTransform.getRotateInstance(Math.PI / 30.0));
        }
        
        // Pinto las marcas grandes, las horas.
        g2.setTransform(mytrans);
        for (int i = 0; i < 12; i++) {
            g2.setColor(Color.WHITE);
            g2.fillRect(800, -15 , 150, 30);
            // g2.setColor(Color.BLACK);
            // g2.drawRect(800, -15 , 150, 30);
            g2.transform(AffineTransform.getRotateInstance(Math.PI / 6.0));
        }
        
        if (m_date != null) {
            // Aguja de las horas
            g2.setTransform(mytrans);       
            g2.transform(AffineTransform.getRotateInstance((dhour + dminute / 60.0) * Math.PI / 6.0)); // Poner hora
            
            if (m_lPeriod > 0L) { // pintamos la marca del periodo...
                // dibujo un arco con el periodo seleccionado...
                int iArc = (int) (m_lPeriod / 120000L);
                g2.setColor(new Color(255, 255, 255, 100));
                g2.fillArc(-1000, -1000, 2000, 2000, 90 - iArc, iArc);
                g2.setColor(Color.DARK_GRAY);
                g2.drawArc(-1000, -1000, 2000, 2000, 90 - iArc, iArc);
            } else {
                // la aguja de las horas
                g2.setColor(Color.WHITE);
                g2.fillPolygon(new int[]{0, -35, 0, 35}, new int[]{100, 0, -600, 0}, 4);   
                g2.setColor(Color.DARK_GRAY);
                g2.drawPolygon(new int[]{0, -35, 0, 35}, new int[]{100, 0, -600, 0}, 4);

                // Aguja de los minutos
                g2.setTransform(mytrans);       
                g2.transform(AffineTransform.getRotateInstance((dminute) * Math.PI / 30.0)); // Poner minutos
                g2.setColor(Color.WHITE);
                g2.fillPolygon(new int[]{0, -35, 0, 35}, new int[]{100, 0, -900, 0}, 4);   
                g2.setColor(Color.DARK_GRAY);
                g2.drawPolygon(new int[]{0, -35, 0, 35}, new int[]{100, 0, -900, 0}, 4);      
        
                // Aguja de los segundos
                if (m_bSeconds) {
                    g2.setTransform(mytrans);       
                    g2.transform(AffineTransform.getRotateInstance(dsecond * Math.PI / 30.0)); // Poner segundos
                    g2.setColor(Color.YELLOW);
                    g2.fillPolygon(new int[]{-15, 0, 15}, new int[]{200, -900, 200},  3);   
                    g2.setColor(Color.DARK_GRAY);
                    g2.drawPolygon(new int[]{-15, 0, 15}, new int[]{200, -900, 200},  3);   

                    g2.setTransform(mytrans);       
                    g2.setColor(Color.YELLOW);
                    g2.fillOval(-25, -25, 50, 50);
                    g2.setColor(Color.DARK_GRAY);
                    g2.drawOval(-25, -25, 50, 50);
                }
            }
        }
        
        // Pinto el tornillo central
        g2.setColor(Color.WHITE);
        g2.fillOval(-10, -10, 20, 20);
        g2.setColor(Color.BLACK);
        g2.drawOval(-10, -10, 20, 20);
        
        // restauro los valores iniciales
        g2.setTransform(oldt);
        g2.setPaint(oldPainter);
    }   
    
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
    }// </editor-fold>//GEN-END:initComponents
    
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    // End of variables declaration//GEN-END:variables
    
}
