package Übungen.BreakOut;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

public class GamePlay extends JPanel implements Runnable,KeyListener,ActionListener {
	
	// Schläger
	final int WIDTH = 80;
	final int HEIGHT = 10;
	int positionX = 700 / 2;
	int positionY = 700 - HEIGHT - 50;
	int bewegung = 0;
	Rectangle schläger;
	
	// Ball
	final int WIDTHball = 10;
	final int HEIGHTball = 10;
	int positionXball = 700 / 2;
	int positionYball = 700 - HEIGHT - 90;
	double bewegungxball = 1 ;
	double bewegungyball = 1;
	Rectangle ball;
	
	Random rand = new Random();
	
	
	int anzahlRects = 18;
	int[][] spielField = new int[3][6];
	
	// Startpositionen für die Blöcke
	int posX = 60;
	int posY = 60;
	int width = 80;
	int height = 10;
	
	
	Rectangle schlägerGame;
	
	boolean gameOver = false;
	
	
	GamePlay(){
		this.schläger = new Rectangle(positionX,positionY,WIDTH,HEIGHT);
		this.ball = new Rectangle(positionXball,positionYball,WIDTHball,HEIGHTball);
		fülleMitEinsen();
		schlägerGame = new Rectangle(posX,posY,width,height);
		
	
		
		this.addKeyListener(this);
		this.setFocusable(true);
		this.setFocusTraversalKeysEnabled(false);
		
		
	
	}
	
	public void fülleMitEinsen() {
		
		for (int i = 0; i < 3; i++)
			for (int j = 0; j < 6;j++)
				spielField[i][j] = 1;
	}
	
	
	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);

		// Screen
		g.setColor(Color.BLACK);
		g.fillRect(0, 0, 700, 700);

		// Schläger
		g.setColor(Color.WHITE);
		g.fillRect(schläger.x, schläger.y, schläger.width, schläger.height);

		// Ball
		g.setColor(Color.WHITE);
		g.fillOval(ball.x, ball.y, ball.width, ball.height);

		// Border
		g.setColor(Color.YELLOW);
		g.fillRect(0, 0, 700, 3);
		g.fillRect(0, 0, 3, 700);
		g.fillRect(680, 0, 3, 650);

		// Blöcke zeichnen
		int initialPosX = 60;
		int initialPosY = 60;
		final int width = 80;
		final int height = 10;
		
		posY = initialPosY;

		for (int i = 0; i < 3; i++) {
			posX = initialPosX;
			for (int j = 0; j < 6; j++) {
				if (spielField[i][j] > 0) {
					g.setColor(Color.RED);
					g.fillRect(posX, posY, width, height);
				}
				posX += width + 10; // 10 ist für Spacing
			}
			posY += height + 10;
		}
	}

	public void mov() {
		checkKollision();
	    // MovRect
	    schläger.x += bewegung;

	    if (schläger.x < 0)
	        schläger.x = 0;

	    if (schläger.x > getWidth())
	        schläger.x = 600;

	    // MovBall
	    ball.x += bewegungxball;
	    ball.y -= bewegungyball;

	    if (ball.x <= 0 || ball.x >= 670)
	        bewegungxball = -bewegungxball;

	    if (ball.y <= 0 || ball.intersects(schläger))
	        bewegungyball = -bewegungyball;
	    
	   
	    repaint();
	}
	
	public void setRandX(int x) {
		bewegungxball = x;
	}
	
	public void setRandY(int x) {
		bewegungyball = x;
	}
	
	public void checkKollision() {
		 // Kollision mit Blöcken überprüfen
	    for (int i = 0; i < 3; i++) {
	        for (int j = 0; j < 6; j++) {
	            if (spielField[i][j] > 0) {
	                int blockX = 60 + j * (width);
	                int blockY = 60 + i * (height); 
	                
	                Rectangle block = new Rectangle(blockX, blockY, width, height);
	                
	                if (ball.intersects(block)) {
	                    spielField[i][j] = 0; 

	                    if (ball.x + ball.width - bewegungxball <= block.x || ball.x - bewegungxball >= block.x + block.width) {
	                        bewegungxball = -bewegungxball; 
	                    } else {
	                        bewegungyball = -bewegungyball; 
	                    }
	                }
	            }
	        }
	    }

	    repaint();
	}

	public void setBewegungRect(int x) {
		bewegung = x;
	}
	
	
	

	@Override
	public void run() {
		try {
			while (!gameOver) {
				mov();
				Thread.sleep(2);
			}
		} catch (Exception e) {
			System.err.println(e.getMessage());
		}

	}


	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}


	@Override
	public void keyPressed(KeyEvent e) {
		if (e.getKeyCode() ==KeyEvent.VK_A)
			setBewegungRect(-1);
		
		if (e.getKeyCode() ==KeyEvent.VK_D)
			setBewegungRect(+1);
		
		
	}


	@Override
	public void keyReleased(KeyEvent e) {
		if (e.getKeyCode() ==KeyEvent.VK_A || e.getKeyCode() ==KeyEvent.VK_D)
			setBewegungRect(0);
		
	}


	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		
	}
	
	

}