import java.applet.Applet;
import java.awt.AlphaComposite;
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Stroke;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class DigitRiddleApplet extends JApplet {

	// gui elements
	JComboBox jcoD1, jcoD2, jcoD3, jcoSign;
	JLabel text1, equalitySign;
	JPanel p1, p2, p3;
	JButton b1, b2;
	
	String[] items = new String[]{"0","1","2","3","4","5","6","7","8","9"};
	
	Graphics g;
	
	public void init() {
		
		setSize(400,300);
		
		this.setVisible(true);
		
		setLayout(new BorderLayout());
		
		// north panel
		p1 = new JPanel();
		
		// add some elements
		jcoD1 = new JComboBox(items);
		jcoSign = new JComboBox(new String[]{"+","-"});
		jcoD2 = new JComboBox(items);
		jcoD3 = new JComboBox(items);
		
		equalitySign = new JLabel("=");
		
		b1 = new JButton("Calculate");
		b2 = new JButton("Reset");

		
		p1.add(jcoD1);
		p1.add(jcoSign);
		p1.add(jcoD2);
		p1.add(equalitySign);
		p1.add(jcoD3);
		p1.add(b1);
		p1.add(b2);
			
		this.add(p1, BorderLayout.NORTH);
		
		b1.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent ev) {
					
					//repaint();
					
					// try to find new equations
					DigitRiddle dr = new DigitRiddle(
							jcoD1.getSelectedItem().toString(),
							jcoSign.getSelectedItem().toString(),
							jcoD2.getSelectedItem().toString(),						
							jcoD3.getSelectedItem().toString()
							);
					
					//DigitRiddle dr = new DigitRiddle();
					//System.out.println(jcoD1.getSelectedItem().toString() + jcoSign.getSelectedItem().toString());
				
					// call recursive method
					dr.searchTree();
					
					String[] eq = null;
					
					if (dr.correctEquations.size()>0) {
						eq = (String[])dr.correctEquations.get(0);
						paintEquation(eq.clone(), false);
					}
					else {				
						// no correct equations found
						System.out.println("No possible correct equations found");
					}
					
					// if more than one correct equation was found,
					// give a notice			
					for (int i = 1; i < dr.correctEquations.size(); i++) {
						eq = (String[])dr.correctEquations.get(i);	
						paintEquation(eq.clone(), true);
					}
				
					
				}
			}
		);

		b2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ev) {
				
				// reset gui fields
				jcoD1.setSelectedIndex(0);
				jcoSign.setSelectedIndex(0);
				jcoD2.setSelectedIndex(0);
				jcoD3.setSelectedIndex(0);
				
				
				repaint();
			}
		}
	);

	}
	
	public void paint(Graphics g) {
		//super.paint(g);
		this.g = g;
		g.setColor(Color.BLUE);
        g.clearRect (0, 35, 500, 500);
        //g.fillRect (0, 35, 500, 500);

	}
	
	private void paintEquation(String[] equation, boolean more) {
		
		Graphics2D g = (Graphics2D) this.getGraphics();

		g.setColor(Color.BLACK);
		g.drawString("Correct equation:",50,90);
		
		
		// if boolean more is true paint other equations as text
		if (more) {
			g.setColor(Color.BLACK);
			g.drawString("Additional correct equation:",50,250);
			g.drawString(equation[0]+equation[1]+equation[2]+"="+equation[3],50,270);
			return;
		}

		g.setStroke(new BasicStroke(4));

		g.setColor(Color.RED);
		drawDigit(g, jcoD1.getSelectedItem().toString().charAt(0), "0".charAt(0));
		drawDigit(g, jcoSign.getSelectedItem().toString().charAt(0), "1".charAt(0));
		drawDigit(g, jcoD2.getSelectedItem().toString().charAt(0), "2".charAt(0));
		drawDigit(g, "=".charAt(0), "=".charAt(0));
		drawDigit(g, jcoD3.getSelectedItem().toString().charAt(0), "3".charAt(0));

		g.setStroke(new BasicStroke(4));
		g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, (float)0.4));
		g.setColor(Color.GREEN);
		drawDigit(g, equation[0].charAt(0), "0".charAt(0));
		drawDigit(g, equation[1].charAt(0), "1".charAt(0));
		drawDigit(g, equation[2].charAt(0), "2".charAt(0));
		drawDigit(g, "=".charAt(0), "=".charAt(0));
		drawDigit(g, equation[3].charAt(0), "3".charAt(0));

	}
	
	private void drawDigit(Graphics2D g, char digit, char pos) {
		
		int startX = 50;
		
		// set x coordinate depending on digit position in equation
		switch (pos) {
		case '0':
			startX = 50;
			break;
		case '1':
			startX = 120;
			break;
		case '2':
			startX = 190;
			break;
		case '=':
			startX = 260;
			break;
		case '3':
			startX = 330;
			break;
		default:
			startX = 50;
			break;
		}
				
		// define lines for each digit
		switch (digit) {
		case '0':
			g.drawLine(startX,100,startX+50,100);
			g.drawLine(startX,105,startX,145);
			g.drawLine(startX,155,startX,195);
			g.drawLine(startX+50,105,startX+50,145);
			g.drawLine(startX+50,155,startX+50,195);
			g.drawLine(startX,200,startX+50,200);		

			break;
		case '1':
			g.drawLine(startX+50,100,startX+50,145);
			g.drawLine(startX+50,155,startX+50,195);
			
			break;
		case '2':
			g.drawLine(startX,100,startX+50,100);
			g.drawLine(startX+50,105,startX+50,145);
			g.drawLine(startX,150,startX+50,150);
			g.drawLine(startX,155,startX,195);
			g.drawLine(startX,200,startX+50,200);		
			
			break;
		case '3':
			g.drawLine(startX,100,startX+50,100);
			g.drawLine(startX+50,105,startX+50,145);
			g.drawLine(startX,150,startX+50,150);
			g.drawLine(startX+50,155,startX+50,195);
			g.drawLine(startX,200,startX+50,200);		
			
			break;
		case '4':
			g.drawLine(startX,105,startX,145);
			g.drawLine(startX,150,startX+50,150);
			g.drawLine(startX+50,105,startX+50,145);
			g.drawLine(startX+50,155,startX+50,195);
			
			break;
		case '5':
			g.drawLine(startX,100,startX+50,100);
			g.drawLine(startX,105,startX,145);
			g.drawLine(startX,150,startX+50,150);
			g.drawLine(startX+50,155,startX+50,195);
			g.drawLine(startX,200,startX+50,200);		
			
			break;
		case '6':
			g.drawLine(startX,100,startX+50,100);
			g.drawLine(startX,105,startX,145);
			g.drawLine(startX,155,startX,195);
			g.drawLine(startX,150,startX+50,150);
			g.drawLine(startX+50,155,startX+50,195);
			g.drawLine(startX,200,startX+50,200);		
			
			break;
		case '7':
			g.drawLine(startX,100,startX+50,100);
			g.drawLine(startX+50,105,startX+50,145);
			g.drawLine(startX+50,155,startX+50,195);
			
			break;
		case '8':
			g.drawLine(startX,100,startX+50,100);
			g.drawLine(startX,105,startX,145);
			g.drawLine(startX,150,startX+50,150);
			g.drawLine(startX,155,startX,195);
			g.drawLine(startX+50,105,startX+50,145);
			g.drawLine(startX+50,155,startX+50,195);
			g.drawLine(startX,200,startX+50,200);		
			
			break;
		case '9':
			g.drawLine(startX,100,startX+50,100);
			g.drawLine(startX,105,startX,145);
			g.drawLine(startX,150,startX+50,150);
			g.drawLine(startX+50,105,startX+50,145);
			g.drawLine(startX+50,155,startX+50,195);
			g.drawLine(startX,200,startX+50,200);		
			
			break;
		case '+':
			g.drawLine(startX+5,150,startX+45,150);
			g.drawLine(startX+25,125,startX+25,175);
			
			break;
		case '-':
			g.drawLine(startX+5,150,startX+45,150);
			
			break;
		case '=':
			g.drawLine(startX+10,145,startX+35,145);
			g.drawLine(startX+10,155,startX+35,155);
			
			break;
		default:
			break;	
		}
	}
}
