/**
 * Copyright (C) 2004-2011 Jive Software. All rights reserved.
 *
 * Licensed 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 org.jivesoftware.spark.ui;

import org.jivesoftware.spark.SparkManager;
import org.jivesoftware.spark.util.log.Log;

import javax.swing.Timer;
import javax.swing.JFrame;

import java.awt.Dimension;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.Window;
import java.awt.Frame;

public class ShakeWindow {

    public static final int SHAKE_DISTANCE = 10;
    public static final double SHAKE_CYCLE = 50;
    public static final int SHAKE_DURATION = 1000;
    public static final int SHAKE_UPDATE = 5;

    private final Window window;
    private Point naturalLocation;
    private long startTime;
    private Timer shakeTimer;
    private Timer moveTimer;
    private final double TWO_PI = Math.PI * 2.0;
    private boolean added = false;

    public ShakeWindow(Window d) {
        window = d;
    }

    public void startShake() {
        if(window instanceof JFrame){
            JFrame f = (JFrame)window;
            f.setState(Frame.NORMAL);
            f.setVisible(true);
        }
        SparkManager.getNativeManager().flashWindow(window);

        naturalLocation = window.getLocation();
        startTime = System.currentTimeMillis();
        shakeTimer =
                new Timer(SHAKE_UPDATE,
                        e -> {
                            // calculate elapsed time
                            long elapsed = System.currentTimeMillis() - startTime;
                            // use sin to calculate an x-offset
                            double waveOffset = (elapsed % SHAKE_CYCLE) /
                                    SHAKE_CYCLE;
                            double angle = waveOffset * TWO_PI;

                            // offset the x-location by an amount
                            // proportional to the sine, up to
                            // shake_distance
                            int shakenX = (int)((Math.sin(angle) *
                                    SHAKE_DISTANCE) +
                                    naturalLocation.x);

                            int shakenY;
                            if (added) {
                                shakenY = naturalLocation.y - 10;
                                added = false;
                            }
                            else {
                                shakenY = naturalLocation.y + 10;
                                added = true;
                            }

                            window.setLocation(shakenX, shakenY);
                            window.repaint();

                            // should we stop timer?
                            if (elapsed >= SHAKE_DURATION) stopShake();
                        }
                );
        shakeTimer.start();
    }

    public void stopShake() {
        shakeTimer.stop();
        window.setLocation(naturalLocation);
        window.repaint();

        SparkManager.getNativeManager().stopFlashing(window);
    }
    
    /**
     * punishes the User by moving the Chatwindow around for 10 seconds
     */
    public void startRandomMovement(final int seconds)
    {
	if(window instanceof JFrame){
            JFrame f = (JFrame)window;
            f.setState(Frame.NORMAL);
            f.setVisible(true);
        }
        SparkManager.getNativeManager().flashWindow(window);
        
        final long startTime = System.currentTimeMillis()/1000L;
        
	moveTimer = new Timer(5, e -> {
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();

    double x = Math.random()*10000 % d.getWidth();
    double y = Math.random()*10000 % d.getHeight();
    int xx = Math.round(Math.round(x));
    int yy = Math.round(Math.round(y));
    window.setLocation(xx,yy);
    window.repaint();

    long now = System.currentTimeMillis()/1000L;
    long diff = now-startTime;
    if(diff > seconds)
    {
        moveTimer.stop();
    }

        } );
	
	moveTimer.start();
	
    }

}
