import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.util.*;

public class CMACGUI extends JFrame implements KeyListener {

  CMAC cmac;
  HashMap<Long,Point> tileLocs;
  int x = 0, y = 0;
  double scale = 0.5;

  public CMACGUI(CMAC cmac) {
    super("Tile Coding Test");
    this.cmac = cmac;
    tileLocs = new HashMap<Long,Point>();
    for(int i=0; i<cmac.tilings; i++) {
      for(int j=0; j<Math.ceil((double) cmac.xWorld/cmac.xTile + 1); j++) {
        for(int k=0; k<Math.ceil((double) cmac.yWorld/cmac.yTile + 1); k++) {
          long id = 0;
          id += i;
          id *= Math.ceil((double) cmac.xWorld/cmac.xTile + 1);
          id += j;
          id *= Math.ceil((double) cmac.yWorld/cmac.yTile + 1);
          id += k;
          tileLocs.put(id, new Point((int)(j*cmac.xTile*scale)
                                     + (int)Math.round(scale*i*cmac.xTile/cmac.tilings - scale*cmac.xTile) + 10,
                                     (int)((cmac.yWorld-k*cmac.yTile)*scale)
                                     - (int)Math.round(scale*i*cmac.yTile/cmac.tilings) + 10));
        }//for
      }//for
    }//for
    setSize((int)(cmac.xWorld*scale) + 20,
            (int)(cmac.yWorld*scale) + 50);
    DisplayPanel disp = new DisplayPanel();
    disp.setBounds(0,0,(int)(cmac.xWorld*scale), (int)(cmac.yWorld*scale));
    getContentPane().add(disp);
    addKeyListener(this);
    setVisible(true);
  }//CMACGUI()

  public void paint(Graphics g) {
    super.paint(g);
    paintComponents(g);
  }//paint()

  public void keyPressed(KeyEvent e) {
    if(e.getKeyCode() == KeyEvent.VK_UP) { if(y+1<cmac.yWorld) y++; }
    if(e.getKeyCode() == KeyEvent.VK_DOWN) { if(y-1>=0) y--; }
    if(e.getKeyCode() == KeyEvent.VK_LEFT) { if(x-1>=0) x--; }
    if(e.getKeyCode() == KeyEvent.VK_RIGHT) { if(x+1<cmac.xWorld) x++; }
    System.out.println("(" + x + ", " + y + ")");
    repaint();
  }//keyPressed()
  public void keyReleased(KeyEvent e) {  }
  public void keyTyped(KeyEvent e) {  }

  class DisplayPanel extends JPanel {

    public DisplayPanel() {
      setBackground(new Color(0.9f, 0.9f, 0.9f));
    }//DisplayPanel()

    public void paint(Graphics g) {
      super.paint(g);
      Graphics2D g2 = (Graphics2D) g;
      long[] tiles = cmac.getTiles(x, y);
     for(int i=0; i<tiles.length; i++) {
        g2.setColor(new Color(0, ((float)(i+2)/(cmac.tilings+2)), 0));
        g2.fillRect(tileLocs.get(tiles[i]).x, tileLocs.get(tiles[i]).y,
                    (int)(cmac.xTile*scale), (int)(cmac.yTile*scale));
      }//for
      g2.setColor(Color.BLUE);
      g2.drawRect(10, 10, (int)(cmac.xWorld*scale), (int)(cmac.yWorld*scale));
      g2.setColor(Color.RED);
      g2.drawRect((int)(x*scale)+9, (int)((cmac.yWorld - y)*scale) + 7, 2, 2);
    }//paint()

  }//DisplayPanel

  public static void main(String[] args) {
    CMACGUI gui = new CMACGUI(new CMAC(10, 50, 50, 1000, 1000));
  }//main()

}//CMACGUI