package model.Elements;


import model.Board.Board;
import model.Elements.Obstacle.Mountain;
import model.Elements.Obstacle.Obstacle;
import model.Elements.Obstacle.Road;
import util.Neighbour;
import util.Position;

import java.util.*;


public class Fire implements Element {

    private Position position;

    private Neighbour neighbour;
    private final ModelElement modelElement;


    public Fire(Position position){
        this.position = position;
        modelElement = ModelElement.FIRE;
    }


    public Position getPosition() {
        return position;
    }

    @Override
    public ModelElement getElement() {
        return modelElement;
    }

    public void setPosition(Position position) {
        this.position = position;
    }


    public List<Position> update(Board<List<ModelElement>> firefighterBoard) {
        this.neighbour = new Neighbour(firefighterBoard);

        List<Position> modifiedPositions = new ArrayList<>();
        if (firefighterBoard.stepNumber() % 2 == 0) {
            Set<Position> newFirePositions = new HashSet<>();

            for (Position fire : new HashSet<>(firefighterBoard.getFires().keySet())) {
                newFirePositions.addAll(removeMountainAndRoads(firefighterBoard,fire));
            }

            for (Position position : newFirePositions) {
                if (!firefighterBoard.getFires().containsKey(position)) {
                    firefighterBoard.getFires().put(position, new Fire(position));
                    modifiedPositions.add(position);
                }
            }
        }
        return modifiedPositions;
    }

    private List<Position>removeMountainAndRoads(Board<List<ModelElement>> firefighterBoard,Position position){
        List<Position>neighboursAvailable;

        neighboursAvailable = this.neighbour.getNeighbors().get(position);
        if(firefighterBoard.stepNumber()%4==0){
            List<Position>MountainAndRoadsPositions = new ArrayList<>();
            for(Obstacle obstacle : firefighterBoard.getObstacles().values()){
                if(obstacle instanceof Road || obstacle instanceof Mountain){
                    MountainAndRoadsPositions.add(obstacle.getPosition());
                    neighboursAvailable.removeAll(MountainAndRoadsPositions);
                }
            }
        }
        else{

            neighboursAvailable.removeAll(firefighterBoard.getObstacles().keySet());
        }


        return neighboursAvailable;
    }





}