
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.DecimalFormat;

import javax.imageio.ImageIO;
import javax.swing.*;


public class FinalPiano extends JPanel{
	// n= message dialog me e deklaru si private dhe me e kqyr kur shfaqet applikacioni me ekzektu me buton 
	JFrame frame = new JFrame();
	private int pergjigjja=2;
	DecimalFormat format = new DecimalFormat("00");
	Mouseclass mouse = new Mouseclass();
	static FinalPiano  p = new FinalPiano(400,600,4,0,600-600/4,600-2*(600/4),600-3*(600/4),600- 600,-602/4);
	private Butoni exit  = new Butoni();
	private Faster fast = new Faster();
	private Lower low = new Lower();
	private Resume resume = new Resume();
	private Pause pause = new Pause();
	public static int milisekondat = 10;
	private boolean proces_start=true;
	public boolean mause_clicked=false;
	public boolean fastProces = false;
	private int rritja =0;
	private String labela;
	private int gj;
	private int la;
	private boolean proces= true;
	private boolean pause1 = false,resume1=false;
	private int nr_sustave;
	private int x;
	private int y,y1,y2,y3,y4;
	private int z,z1,z2,z3,z4;
	private int v,v1,v2,v3,v4;
	private boolean click=true,click1=true,click2=true,click3=true,click4=true;
	private int score=00;
	private int x_pos=700,y_pos=700;
	private int random = gjenero(),random1=gjenero(),random2=gjenero(),random3=gjenero(),random4=gjenero();
	public Font fonti = new Font("Serif",Font.CENTER_BASELINE,30);
	public BufferedImage image;
	public FinalPiano(int g, int l,int sustat,int xx, int yy,int y11,int y22,int y33,int y44)

	{
		
		gj=g;
		la=l;
		nr_sustave = sustat;
		x=xx;
		y=yy;
		y1=y11;
		y2=y22;
		y3=y33;
		y4=y44;
		labela="0";
		
		this.setLayout(new FlowLayout());
		pause.setForeground(Color.black);
		pause.setBackground(Color.white);
		resume.setForeground(Color.white);
		resume.setBackground(Color.black);
		this.add(pause,new FlowLayout(FlowLayout.RIGHT));
		this.add(new JLabel("                                                                    "));
		this.add(resume,new FlowLayout(FlowLayout.LEFT));
		frame.getContentPane().add(this);
		//frame.setDefaultCloseOperation();
		JMenuBar mbar = new JMenuBar();
		mbar.setBackground(Color.black);
		JMenu file = new JMenu("File");
		file.setForeground(Color.white);
		low.setForeground(Color.white);
		fast.setForeground(Color.black);
		low.setBackground(Color.black);
		file.add(low);
		file.add(fast);
		file.add(exit);
		//JMenu edit = new JMenu("Edit");
		//edit.setForeground(Color.white);

		//edit.add(pause);
		//edit.add(resume);
		
		mbar.add(file);
		//mbar.add(edit);
		frame.setJMenuBar(mbar);
		frame.setTitle("Piano Tiles");
		frame.setSize(gj+17,la+50);
		frame.addMouseListener(mouse);
		frame.addMouseMotionListener(mouse);
		frame.setVisible(true);
/*		try {
			image = ImageIO.read(new File("background.jpeg"));
			
		} catch (Exception e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}*/
	
		
		
	}
	public void paintComponent(Graphics g)
	{
		

		
		Font f = new Font("Serif",Font.CENTER_BASELINE,40);
		g.setColor(Color.white);
		g.fillRect(0, 0,gj,la); 
		g.setColor(Color.white);
		//Figura e pare
		for(int i=1;i<=nr_sustave;i++)
		{
	
		g.setColor(Color.white);
			if(i==random)
			{
				if(rritja==0)
				{
					g.setColor(Color.red);

				}else{
				g.setColor(Color.black);
				}
				z=(random-1)*100;
				v=y;
				
				
			}
			
		g.fillRect(x,y,gj/nr_sustave,la/nr_sustave);
		//vizatohen kornizat e sustave
		g.setColor(Color.black);
		g.drawRect(x,y,gj/nr_sustave,la/nr_sustave);
	
			if(click==false)
				{
					g.setColor(Color.gray);
					g.fillRect(z, v, gj/nr_sustave, la/nr_sustave);
					g.setColor(Color.black);
				}
		x=x+100;
		if(x==400)
		{
			x=0;
		}
		
		}
		if(y>=la)
		{
			random=gjenero();
			y=0;
			y=y-la/nr_sustave;
			click=true;
		}
		//Figura e dyte
		
		for(int i=1;i<=nr_sustave;i++)
		{
		g.setColor(Color.white);
			if(i==random1)
			{
				g.setColor(Color.black);
				z1=(random1-1)*100;
				v1=y1;
				
			}
			
		g.fillRect(x,y1,gj/nr_sustave,la/nr_sustave);
		//vizatohen kornizat e sustave
		g.setColor(Color.black);
		g.drawRect(x,y1,gj/nr_sustave,la/nr_sustave);
		if(click1==false)
		{
			g.setColor(Color.gray);
			g.fillRect(z1, v1, gj/nr_sustave, la/nr_sustave);
			g.setColor(Color.black);
		}
		x=x+100;
		if(x==400)
		{
			x=0;
		}
		
		}
		if(y1>=la)
		{
			random1=gjenero();
			y1=0;
			y1=y1-la/nr_sustave;
			click1=true;
		}
		
		//Figura e trete
		for(int i=1;i<=nr_sustave;i++)
		{
		g.setColor(Color.white);
			if(i==random2)
			{
				g.setColor(Color.black);
				z2=(random2-1)*100;
				v2=y2;
				
			}
			
		g.fillRect(x,y2,gj/nr_sustave,la/nr_sustave);
		//vizatohen kornizat e sustave
		g.setColor(Color.black);
		g.drawRect(x,y2,gj/nr_sustave,la/nr_sustave);
		if(click2==false)
		{
			g.setColor(Color.gray);
			g.fillRect(z2, v2, gj/nr_sustave, la/nr_sustave);
			g.setColor(Color.black);
		}
		x=x+100;
		if(x==400)
		{
			x=0;
		}

		
		}
		if(y2>=la)
		{
			random2=gjenero();
			y2=0;
			y2=y2-la/nr_sustave;
			click2=true;
		}
		
		
		//Figura e katert
		for(int i=1;i<=nr_sustave;i++)
		{
		g.setColor(Color.white);
			if(i==random3)
			{
				g.setColor(Color.black);
				z3=(random3-1)*100;
				v3=y3;
				
			}
			
		g.fillRect(x,y3,gj/nr_sustave,la/nr_sustave);
		//vizatohen kornizat e sustave
		g.setColor(Color.black);
		g.drawRect(x,y3,gj/nr_sustave,la/nr_sustave);
		if(click3==false)
		{
			g.setColor(Color.gray);
			g.fillRect(z3, v3, gj/nr_sustave, la/nr_sustave);
			g.setColor(Color.black);
		}
		x=x+100;
		if(x==400)
		{
			x=0;
		}

		
		}
		if(y3>=la)
		{
			random3=gjenero();
			y3=0;
			y3=y3-la/nr_sustave;
			click3=true;
		}
		
		//Figura e peste
		for(int i=1;i<=nr_sustave;i++)
		{

		g.setColor(Color.white);
			if(i==random4)
			{
				g.setColor(Color.black);
				z4=(random4-1)*100;
				v4=y4;
				
			}
			
		g.fillRect(x,y4,gj/nr_sustave,la/nr_sustave);
		//vizatohen kornizat e sustave
		g.setColor(Color.black);
		g.drawRect(x,y4,gj/nr_sustave,la/nr_sustave);
		
		if(click4==false)
		{
			g.setColor(Color.gray);
			g.fillRect(z4, v4, gj/nr_sustave, la/nr_sustave);
			g.setColor(Color.black);
		}
		x=x+100;
		if(x==400)
		{
			x=0;
		}
		
		}
		if(y4>=la)
		{
			random4=gjenero();
			y4=0;
			y4=y4-la/nr_sustave;
			click4=true;
			
		}
		
		
		//Start string

		
		if(rritja==0)
		{
		g.setColor(Color.white);
		g.setFont(fonti);
		g.drawString("Start",z+16,v+60);
		}
		//SCOOOOREEEEE
		//&&(y_pos>=la/2)
	
		if(mause_clicked&&click==true&&(y_pos>=v+55&&y_pos<=v+(la/nr_sustave)+55)&&(x_pos>=z&&x_pos<=z+100))
		{
			score=score+1;
			proces_start=true;
			if(rritja==0)
			{
				rritja=1;

			}
		
			//System.out.println(""+score + "E para");
			click=false;
		}
		else if(rritja>0&&mause_clicked&&click1==true&&(y_pos>=v1+55&&y_pos<=v1+(la/nr_sustave)+55)&&(x_pos>=z1&&x_pos<=z1+100))
			{	
			score=score+1;
			proces_start=true;
			//System.out.println(""+score+"E dyta");
			click1=false;
			}
		else if(rritja>0&&mause_clicked&&click2==true&&(y_pos>=v2+55&&y_pos<=v2+(la/nr_sustave)+55)&&(x_pos>=z2&&x_pos<=z2+100))
			{
			score=score+1;
			proces_start=true;
			//System.out.println(""+score+"E treta");
			click2=false;
			}
		else if(rritja>0&&mause_clicked&&click3==true &&(y_pos>=v3+55&&y_pos<=v3+(la/nr_sustave)+55)&&(x_pos>=z3&&x_pos<=z3+100))
			{
			score=score+1;
			proces_start=true;
			//System.out.println(""+score+"E katerta");
			click3=false;
			}
		else if(rritja>0&&mause_clicked&&click4==true &&(y_pos>=v4+55&&y_pos<=v4+(la/nr_sustave)+55)&&(x_pos>=z4&&x_pos<=z4+100))
			{
			proces_start=true;
			score=score+1;
			//System.out.println(""+score+"E pesta");
			click4=false;
			
			}
		//Kur perdoruesi nuk klikon ne njerin nga sustat dhe ajo iken teposht procesi ndalet
		if((click==true&&y>=590)||(click1==true&&y1>=590)||(click2==true&&y2>=590)
				||(click3==true&&y3>=590)||(click4==true&&y4>=590))
		{
			proces=false;
			
		}
		//kur perdoruesi klikon ne te bardhen 
	/*	if(mause_clicked&&click==true&&(y_pos<=v&&y_pos>=v+(la/nr_sustave))&&(x_pos<=z&&x_pos>=z+100))
		{
			
			proces = false;
			JOptionPane.showMessageDialog(this,"Humbet");
			proces=false;
		}*/
		
		proces_start=false;
		
		
		g.setFont(f);
		
		g.setColor(Color.red);
		g.drawString(labela, 181, 40);
					if(proces==false)
							{
								
								Font fo = new Font("Arial",Font.CENTER_BASELINE,40);
								Font Fot = new Font("Serif",Font.CENTER_BASELINE,30);
								g.setFont(fo);
								g.fillRect(0,0,gj,la);
								g.setColor(Color.white);
								g.drawRect(105,60,200,160);
								g.drawRect(106,61,198,158);
								g.setColor(Color.black);
								g.drawString("Sc",150,130);
								g.setColor(Color.black);
								g.drawString("o", 199, 130);
								g.setColor(Color.black);
								g.drawString("re",223,130);
								g.setColor(Color.white);
								g.drawString(""+ format.format(score),185,200);
								g.setFont(Fot);
								g.setColor(Color.black);
								g.drawString("Edon Zogaj",150,450);
								
								
								
							}
		
	

		
		
	
	}
	public void leviz()
	{
		y=y+rritja;
		y1=y1+rritja;
		y2=y2+rritja;
		y3=y3+rritja;
		y4=y4+rritja;
	
	}

	public void setLabel()
	{
		labela=""+format.format(score);
	}
	public void zbritSekondat()
	{
		if(fastProces==false)
		{
		if(score>10&&pause1==false)
		{
		//rritja=2;
		milisekondat=9;
		}
		if(score>20&&pause1==false)
		{
			//rritja=2;
			milisekondat=8;
		}
		if(score>40&&pause1==false)
		{
			//rritja=4;
			milisekondat=7;
		}
		if(score>50&&pause1==false)
		{
			milisekondat=6;
			//rritja=5;
		}
		if(score>70&&pause1==false)
		{
			milisekondat=5;
		}
		if(score>100&&pause1==false)
		{
			milisekondat=4;
		}
		if(score>150&&pause1==false)
		{
			milisekondat=3;
		}
		if(score>300&&pause1==false)
		{
			milisekondat=1;
		}
		}
		else{
			if(score>50&&fastProces==true&&pause1==false)
			{
				milisekondat=2;
			}
		}
	}
	//kthen gjendjen e procesit te leojes
	public boolean proces()
	{
		return proces;
	}
	public void replay()
	{
		mause_clicked=false;
		click=true;
		score=0;
		gj=400;la=600;nr_sustave=4;x=0;y=600 - 600/4;y1=600-2*(600/4);y2=600-3*(600/4);y3=600-600;y4=-600/4;
		random = gjenero();random1=gjenero();random2=gjenero();random3=gjenero();random4=gjenero();
		click1=true;click2=true;click3=true;click4=true;
		rritja=0;
		milisekondat=10;
		fastProces=false;
		proces=true;
		
		
		
	}
	public void replayFast()
	{
		mause_clicked=false;
		click=true;
		score=0;
		gj=400;la=600;nr_sustave=4;x=0;y=600 - 600/4;y1=600-2*(600/4);y2=600-3*(600/4);y3=600-600;y4=-600/4;
		random = gjenero();random1=gjenero();random2=gjenero();random3=gjenero();random4=gjenero();
		click1=true;click2=true;click3=true;click4=true;
		rritja=3;
		proces=true;
		
		
		
	}

	public void whilee() throws InterruptedException
	{
		
		while(this.proces())
		{
			this.zbritSekondat();
			Thread.sleep(milisekondat);
			this.leviz();
			this.setLabel();
			this.repaint();
			
			
		}
		if(this.proces()==false)
		{
			
			int n = JOptionPane.showConfirmDialog(this,"Humbet\n"+"Deshironi nje loje te re?");
			if(n== JOptionPane.YES_OPTION)
			{
				
				this.replay();
				this.whilee();
				
					
				
				
			}
			else if(n==JOptionPane.NO_OPTION)
			{
				System.exit(0);
			}
		}
	}
	
	public static void main(String[]args) throws InterruptedException
	{
		
		p.whilee();
		
		
	}
	
	
	public static int gjenero()
	{
		int n = (int) (4*Math.random());
		return n+1;
	}
	
	private class Mouseclass implements MouseListener,MouseMotionListener{

		@Override
		public void mouseDragged(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void mouseMoved(MouseEvent e) {
		}

		@Override
		public void mouseClicked(MouseEvent e) {
		
			
		}

		@Override
		public void mouseEntered(MouseEvent e) {
			
		
		
		}

		public void mouseExited(MouseEvent e) {


		}

		public void mousePressed(MouseEvent e) {
			x_pos = e.getX();
			y_pos = e.getY();
			mause_clicked=true;
		
		

		}

		public void mouseReleased(MouseEvent e) {
			
			mause_clicked=false;
		}
		
	}
	 class Butoni extends JMenuItem implements ActionListener
	{

	
		public Butoni()
		{
			super("Exit");
			this.setBackground(Color.black);
			this.setForeground(Color.white);
			this.addActionListener(this);

			
		}
		public void actionPerformed(ActionEvent e2)
		{
			System.exit(0);
			
		
		}
		
	}
	 class Faster extends JMenuItem implements ActionListener
	 {
		 public Faster()
		 {
			 super("Faster");
			 this.addActionListener(this);
		 }

		@Override
		public void actionPerformed(ActionEvent e2) {
		
			milisekondat=3;
			fastProces=true;
		} 
	 }
	 class Lower extends JMenuItem implements ActionListener
	 {
		 public Lower()
		 {
			 super("Slower");
			 this.addActionListener(this);
			 
		 }
		 @Override
		public void actionPerformed(ActionEvent e2) {
	
			fastProces=false;
			milisekondat=10;
		}
	 }
	 class Pause extends JButton implements ActionListener
	 {
		 public Pause()
		 {
			 super("Pause 1m");
			 this.addActionListener(this);
			 this.setSelected(true);
			 this.setFocusable(false);
		 }
		 @Override
		public void actionPerformed(ActionEvent e2) {
	
			 milisekondat=1000;
			 pause1=true;
		}
	 }
	 
	 class Resume extends JButton implements ActionListener
	 {
		 public Resume()
		 {
			 super("Resume");
			 this.addActionListener(this);
			 this.setSelected(false);
			 this.setFocusable(false);
		 }
		 @Override
		public void actionPerformed(ActionEvent e2) {
	
				if(fastProces==false)
				{
					if(score<=10)
					{
						milisekondat=10;
					}
				if(score>10)
				{
				//rritja=2;
				milisekondat=9;
				}
				if(score>20)
				{
					//rritja=2;
					milisekondat=8;
				}
				if(score>40)
				{
					//rritja=4;
					milisekondat=7;
				}
				if(score>50)
				{
					milisekondat=6;
					//rritja=5;
				}
				if(score>70)
				{
					milisekondat=5;
				}
				if(score>100)
				{
					milisekondat=4;
				}
				if(score>150)
				{
					milisekondat=3;
				}
				if(score>300)
				{
					milisekondat=1;
				}
				}
				else{
					if(score<=50&&fastProces==true)
					{
						milisekondat=3;
					}
					if(score>50&&fastProces==true)
					{
						milisekondat=2;
					}
				}
		}
	 }
}
