package ge.edu.freeuni.sdp.snake.model; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; public class HighScoreData { private ArrayList<HighScoreDataPair> pairsList; private FileIOWrapper filesIO; public HighScoreData() { this(new FileIOWrapper()); } public HighScoreData(FileIOWrapper filesIO){ this.filesIO = filesIO; pairsList = new ArrayList<>(); } private String deleteWhiteSpace(String str) { String result = ""; for (int i = 0; i < str.length(); i++) { if (str.charAt(i) != ' ') { result = result + str.charAt(i); } } return result; } public void readFile() { pairsList.clear(); try { for (String line : filesIO.readAllLines( Paths.get("HighScoresTop5.txt"), Charset.defaultCharset())) { int startIndex = line.indexOf('.'); int index = line.lastIndexOf('-'); if (index != -1 && startIndex != -1) { String name = line.substring(startIndex + 1, index); String score = line.substring(index + 1); name = deleteWhiteSpace(name); score = deleteWhiteSpace(score); int number = Integer.parseInt(score); HighScoreDataPair pair = new HighScoreDataPair(name, number); pairsList.add(pair); } } } catch (IOException e) { e.printStackTrace(); } } public int checkIfFileMustBeEdited(int score) { int index = -1; for (int i = 0; i < pairsList.size(); i++) { if (score >= pairsList.get(i).getHighScore()) { index = i; break; } } if (index == -1 && pairsList.size() < 5) { index = pairsList.size(); } return index; } public String getFileContent() { int previous = -1; String result = ""; int place = 0; for (int i = 0; i < pairsList.size(); i++) { String line = ""; int temp = pairsList.get(i).getHighScore(); if (temp != previous) { place++; } previous = temp; line = line + place + ". " + pairsList.get(i).getName() + " - " + temp + "\n"; result = result + line; } return result; } private void writeToFile(String content) { try { FileWriter fw = filesIO.getFileWriter(content); BufferedWriter bw = new BufferedWriter(fw); bw.write(content); bw.close(); } catch (IOException e) { e.printStackTrace(); } } private void removeLastScores(int score) { if (pairsList.size() > 4) { int checker = pairsList.get(4).getHighScore(); for (int i = pairsList.size() - 1; i > 4; i--) { if (pairsList.get(i).getHighScore() != checker) { pairsList.remove(pairsList.size() - 1); } } } } public void editFile(String name, int score) { int index = checkIfFileMustBeEdited(score); if (index != -1) { pairsList.add(index, new HighScoreDataPair(name, score)); removeLastScores(score); String content = getFileContent(); writeToFile(content); } } /** * Class that Wraps File IO * @author Ioane */ public static class FileIOWrapper { /** * @see java.nio.file.Files#readAllLines(Path, Charset) */ public List<String> readAllLines(Path path, Charset cs) throws IOException{ return Files.readAllLines(path, cs); } public FileWriter getFileWriter(String pathname) throws IOException{ File file = new File(pathname); return new FileWriter(file.getAbsoluteFile()); } } }