/**
 * Die Klasse AiPlayer ist die Basis für alle Ki Spieler und jede Spezifische Ki erweitert diese Klasse.
 * @author Florian und Florian
 * */

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;


public abstract class AiPlayer extends LocalPlayer implements Runnable {

    /**
     * Liste aller erstellten ShootThreads
     */
    List<Thread> shootThreads;

    /**
     * Konstruktor
     */
    public AiPlayer() {
        this.setName("AI Player");
        this.shootThreads = new ArrayList<>();
    }

    /**
     * Gibt einen zufälligen Punkt im Spielfeld zurück.
     * @return Ein zufälliger Punkt
     */
    public Point RandomPoint() {
        Random random = new Random(); // Pseudo Random für zufallszahlen
        int posx = random.nextInt(super.board.getSize()); // Generiert 0 - 13
        int posy = random.nextInt(super.board.getSize()); // 
        return new Point(posx,posy);
    }

    /**
     * Initialisiert das Board.
     * @param size größe des Boards
     */
    @Override
    public void createBoard(int size) {
        super.createBoard(size);
        this.aiSetShips();
        this.ready();
    }

    /**
     * Ki Methode zum zufälligen Setzten der Schiffe
     */
    public void aiSetShips() {
        for(int i = 0; i < super.board.getShips().size(); i++) {  // Interiert durch alle Shiffe
            //TODO: set horizontal
            while(!super.board.getShips().get(i).setPosition(RandomPoint(), true, super.board.getShips(), super.board.getSize())) {}
        }    // Versucht das aktuelle Schiff zu setzten und wiederholt solange bis es funktioniert
        return;
    }
    /**
     * Ki Methode zum zufälligen Schießen auf das gegnerische Board.
     */
    public void aiShoot() {
        if (!this.myTurn) return;
        this.enemy.receiveShoot(RandomPoint());
        return;
    }


    @Override
    public synchronized void receiveHit(HitResponse hitResponse) {
        // Eltern-Klasse LocalPlayer updatet myTurn
        super.receiveHit(hitResponse);
        if (this.myTurn) {
            // Neuer Schuss wird erstellt und gestartet.
            Thread t = new Thread(this);
            t.start();
            this.shootThreads.add(t);
        }

    }

    @Override
    public synchronized void receiveShoot(Point point) {
        super.receiveShoot(point);
        if (this.myTurn) {
            Thread t = new Thread(this);
            t.start();
            this.shootThreads.add(t);
        }
    }

    /**
     * Wird aufgerufen, wenn in determineCoinToss festgestellt wurde das die Ki anfängt.
     * Erster Schuss wird gestartet.
     */
    @Override
    public void beginTurn() {
        Thread t = new Thread(this);
        t.start();
        this.shootThreads.add(t);
    }
    
    /**
     * Closes past threads and tries firing a shot.
     * @author Luca Conte
     */
    public void run() {
        Iterator<Thread> i = this.shootThreads.iterator();
        while(i.hasNext()) {
            Thread thread = i.next();
            if (!thread.isAlive()) {
                try {
                    thread.join();
                    i.remove();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            
        }
        
        try {
            Thread.sleep(250);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
           
        this.aiShoot();
    }

    /**
     * Closes all running threads and does some cleanup work so the garbage collector will delete the player
     * @author Luca Conte
     */
    @Override
    public void destroy() {
        super.destroy();
        Iterator<Thread> i = this.shootThreads.iterator();
        while(i.hasNext()) {
            Thread thread = i.next();
            try {
                thread.join();
                i.remove();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}
