import chess.*;
import java.applet.Applet;
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Stack;
import javax.swing.JFrame;
import javax.swing.event.MouseInputAdapter;

/**
 * TowerOfHanoi.java
 *
 * This advanced example doesn't have a game loop.  Instead it responds to
 * mouse events.
 *
 * Created on June 20, 2006, 9:19 PM by jbf
 */
public class TowerOfHanoi extends RunnableApplet {
    Screen myScreen;
    Sprite dragSprite;
    int dragSourcePost;
    
    ArrayList sprites;
    Stack[] posts;
    
    int numberOfDisks= 5;
    int moves= 0;
    
    MouseInputAdapter mia= new MouseInputAdapter() {
        public void mousePressed(MouseEvent e) {
            dragSprite= myScreen.getSpriteAt(e.getX(),e.getY());
            dragSourcePost=-1;
            for ( int i=0; i<3; i++ ) {
                if ( posts[i].size()>0 && posts[i].peek()==dragSprite ) {
                    dragSourcePost=i;
                }
            }
            if ( dragSourcePost==-1 ) dragSprite=null; //it wasn't on top
        }
        
        public void mouseDragged(MouseEvent e) {
            if ( dragSprite!=null ) dragSprite.setPosition(e.getX(),e.getY());
        }
        
        public void mouseReleased(MouseEvent e ) {
            if ( dragSprite!=null ) {
                int dropPost= ( e.getX() - 100 ) / 200; // 0=first post
                if ( dropPost>2 ) dropPost=2;
                if ( dropPost<0 ) dropPost=0;
                
                int diskNum= sprites.indexOf(dragSprite);
                int postDisk;
                if ( posts[dropPost].size() > 0 ) {
                   postDisk= sprites.indexOf( posts[dropPost].peek() );
                } else {
                   postDisk= -1; 
                }
                if ( postDisk < diskNum ) {
                    moves++;
                    myScreen.report( "number of moves: "+moves );
                    posts[dropPost].push(dragSprite);
                    if ( dropPost>0 && posts[dropPost].size()==numberOfDisks ) {
                        Chess.report("You won!");
                    }
                    posts[dragSourcePost].pop();
                }
                updateSprites();
            }
        }
    };
    
    private void updateSprites() {
        for ( int i=0; i<3; i++ ) {
            for ( int j=0; j<posts[i].size(); j++ ) {
                Sprite a= (Sprite)posts[i].get(j);
                a.setPosition( 200+i*200,310-j*30);
            }
        }
    }
    
    public void init() {
        myScreen= Chess.newScreen( this );        
        myScreen.addMouseInputAdapter(mia);
    }
    
    public void run() {        
        
        // draw the posts and the base
        myScreen.fillRect( 190,100, 20, 250 );
        myScreen.fillRect( 390,100, 20, 250 );
        myScreen.fillRect( 590,100, 20, 250 );
        myScreen.fillRect( 70, 320, 700, 50 );
        
        sprites= new ArrayList(numberOfDisks);
        posts= new Stack[3];
        posts[0]= new Stack();
        posts[1]= new Stack();
        posts[2]= new Stack();
        for ( int i=0; i<numberOfDisks; i++ ) {
            Sprite a= myScreen.newSprite("disk"+i+".png",200,310-i*30);
            sprites.add(i,a);
            posts[0].push(a);
        }
        updateSprites();
    }
    
    public static void main(String[] args) {
        JFrame frame= new JFrame("TowerOfHanoi");
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        Applet applet= new TowerOfHanoi();
        Dimension appletDimension= new Dimension(800,400);
        applet.setMinimumSize( appletDimension );
        applet.setPreferredSize( appletDimension );
        frame.setContentPane(applet);
        frame.pack();
        frame.setVisible(true);
        applet.init();
        applet.start();
    } //main
    
} //class
