package model; /**
 * Created by szilard95 on 3/14/17.
 * Project: szoftlab
 */

import java.io.*;
import java.util.ArrayList;

/**
 * A pályák kezeléséért felelős. <br>
 * Képes menteni egy játékállást, betölteni egy korábban lementettet, vagy újat, és kezeli az ezzel járó
 * feliratkoztatásokat (ld. subscription szekvencia). <br>
 * Tárolja a jelenlegi model.Map-ot.
 */
public class MapManager {
    private Game game;
    private Map map;
    private SimulationTimer timer;
    private ArrayList<String> mapRotation=new ArrayList<>();

    /**
     * Instantiates a new model.Map manager.
     *
     * @param timer the timer
     * @param game  the game
     */
    public MapManager(SimulationTimer timer, Game game) {
        this.game = game;
        this.map = null;
        this.timer = timer;
        mapRotation.add("jatek_megnyeres");
        mapRotation.add("cvtest");
        mapRotation.add("hosszu");
    }

    /**
     * Betölti a paraméterül kapott nevű pályát egy model.MapBuilder segítségével.
     *
     * @param mapName the map name
     */
    public void newMap(String mapName) {
        MapBuilder mapBuilder = new MapBuilder(mapName);
        mapBuilder.setGame(game);
        Map newMap = mapBuilder.buildMap();
        if (newMap != null) {
            map=newMap;
            map.subscribe(timer);
        }
    }

    /**
     * Lementi az aktuális játékállást a paraméterben kapott néven.
     *
     * @param mapName the map name
     */
    public void saveMap(String mapName) {
        game.stopGame();
        // Serialization
        try {
            ObjectOutputStream ser = new ObjectOutputStream(new FileOutputStream(mapName));
            ser.writeObject(map);
            ser.close();
        } catch (IOException e) {
            System.err.println("Unable to save level: " + e.getMessage());
        }
        game.resumeGame();
    }

    /**
     * Betölt egy korábban lementett játékállást.
     *
     * @param mapName the map name
     */
    public void loadMap(String mapName) {
        // Deserialization
        try {
            ObjectInputStream ser = new ObjectInputStream(new FileInputStream(mapName));
            map = (Map) ser.readObject();
            if (map == null) {
                System.err.println("Unable to load level: model.Map is null.");
                return;
            }
            map.setGame(game);
            map.subscribe(timer);
        } catch (StreamCorruptedException e) {
            System.err.println("Unable to load level " + mapName + ": data file is corrupted.");
            System.err.println(e.getMessage());
        } catch (ClassNotFoundException e) {
            System.err.println("Unable to load level " + mapName + ": class not found.");
            System.err.println(e.getMessage());
        } catch (InvalidClassException e) {
            System.err.println("Unable to load level " + mapName + ": class is invalid.");
            System.err.println(e.getMessage());
        } catch (IOException e) {
            System.err.println("Unable to load level " + mapName + ": I/O error.");
            System.err.println(e.getMessage());
        }
    }

    public Map getMap() {
        return map;
    }

    public void nextMap() {
        String mapName = mapRotation.get(0);
        mapRotation.remove(mapName);
        mapRotation.add(mapName);
        newMap(mapName);
    }
}

@@ -95,36 +95,8 @@
 o.*;
-%0Aimport java.util.ArrayList;
 %0A%0A/*
@@ -448,69 +448,8 @@
 mer;
-%0A    private ArrayList%3CString%3E mapRotation=new ArrayList%3C%3E();
 %0A%0A  
@@ -714,122 +714,8 @@
 er;%0A
-        mapRotation.add(%22jatek_megnyeres%22);%0A        mapRotation.add(%22cvtest%22);%0A        mapRotation.add(%22hosszu%22);%0A
     
@@ -1079,17 +1079,19 @@
      map
-=
+ = 
 newMap;%0A
@@ -3054,107 +3054,295 @@
 ing 
-mapName = mapRotation.get(0);%0A        mapRotation.remove(mapName);%0A        mapRotation.add(mapName)
+curr%5B%5D = map.getMapName().split(%22_%22);%0A        int next = 0;%0A        try %7B%0A            if (curr.length %3E= 2)%0A                next = Integer.parseInt(curr%5B1%5D);%0A        %7D catch (NumberFormatException %7C NullPointerException ignored) %7B%0A        %7D%0A        next++;%0A        if (next %3E 3) next = 1
 ;%0A  
@@ -3354,23 +3354,31 @@
  newMap(
-mapName
+%22level_%22 + next
 );%0A    %7D

fix map rotation