import processing.core.PApplet;
import processing.core.PImage;

import java.util.LinkedList;

public class GraphicsProgram extends PApplet {

    private LinkedList<int[]> player1Trail = new LinkedList<>(); // Liste für Spieler 1
    private LinkedList<int[]> player2Trail = new LinkedList<>(); // Liste für Spieler 2

    private final int TRAIL_LENGTH = 15;
    private int trailCounter = 17;

    private int distanceTh = 100;


    PImage img1;
    PImage img2;
    PImage backgroundImage;

    public static void main(String[] args) {
        PApplet.main("GraphicsProgram");
    }

    public void settings() {
        fullScreen();
    }

    public void setup() {
        backgroundImage = loadImage("Background.png");
        backgroundImage.resize(1792, 1024);

        img1 = loadImage("TrailBlue.png");
        img2 = loadImage("TrailRed.png");
    }

    public void draw() {
        image(backgroundImage, 0, 0); // Hintergrund zeichnen

        strokeWeight(20); // Linienstärke festlegen

        // Linien für Spieler 1 zeichnen
        stroke(0, 0, 255); // Blau
        drawTrail(player1Trail);

        // Linien für Spieler 2 zeichnen
        stroke(255, 0, 0); // Rot
        drawTrail(player2Trail);
    }

    // Methode, um Linien für eine gegebene Trail-Liste zu zeichnen
    private void drawTrail(LinkedList<int[]> trail) {
        if (trail.size() < 2) return; // Mindestens 2 Punkte nötig, um Linien zu zeichnen

        for (int i = 0; i < trail.size() - 1; i++) {
            int[] current = trail.get(i);
            int[] next = trail.get(i + 1);

            // Null-Check für die Punkte
            if (current != null && next != null) {
                if(current[0]-next[0]> -distanceTh && current[0]-next[0]< distanceTh && current[1]-next[1]> -distanceTh && current[1]-next[1]< distanceTh) {
                    line(current[0], current[1], next[0], next[1]);
                }
            }
        }
    }


    // Methode zum Aktualisieren der Trails für beide Spieler
    public void updateTrail(int x1, int y1, int x2, int y2) {
        if (x1 >= 0 && y1 >= 0) {
            addToTrail(player1Trail, x1, y1);
        }
        if (x2 >= 0 && y2 >= 0) {
            addToTrail(player2Trail, x2, y2);
        }
    }

    // Methode zum Hinzufügen eines Punktes zur Trail-Liste und Begrenzung auf 20 Einträge
    private void addToTrail(LinkedList<int[]> trail, int x, int y) {
        if(trailCounter % 21 == 0) {
            if (x >= 0 && y >= 0) {
                trail.add(new int[]{x, y});
                if (trail.size() > TRAIL_LENGTH) {
                    trail.removeFirst();
                }
            }
        }
        trailCounter++;
    }

}