package fr.lyrgard.hexScape.service;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import fr.lyrgard.hexScape.model.card.CardType;
import fr.lyrgard.hexScape.model.card.CardCollection;
public class CardService {
private static final String CARDS_FOLDER_NAME = "cards";
private static final String NAME = "name";
private static final String FIGURES_3D = "3dFigures";
private static final String cardPropertiesFilename = "card.properties";
private static final String[] IMAGE_TYPES = {"jpg", "jpeg", "bmp", "png"};
private static CardService INSTANCE;
public static synchronized CardService getInstance() {
if (INSTANCE == null) {
INSTANCE = new CardService();
}
return INSTANCE;
}
private CardCollection cardInventory;
private List<File> getCardFolders() {
List<File> folders = new ArrayList<File>();
File commonFolder = new File(AssetService.COMMON_ASSET_FOLDER, CARDS_FOLDER_NAME);
File gameFolder = new File(new File(AssetService.ASSET_FOLDER, ConfigurationService.getInstance().getGameFolder()), CARDS_FOLDER_NAME);
folders.add(commonFolder);
folders.add(gameFolder);
return folders;
}
private CardService() {
loadCardInventory();
}
public CardCollection loadCardInventory() {
cardInventory = new CardCollection();
List<File> baseFolders = getCardFolders();
for (File baseFolder : baseFolders) {
if (baseFolder.exists()) {
for (File folder : baseFolder.listFiles()) {
if (folder.exists() && folder.isDirectory()) {
File cardPropertiesFile = new File(folder, cardPropertiesFilename);
if (cardPropertiesFile.exists() && cardPropertiesFile.isFile() && cardPropertiesFile.canRead()) {
CardType card = new CardType();
Properties cardProperties = new Properties();
InputStream input;
try {
input = new FileInputStream(cardPropertiesFile);
cardProperties.load(input);
String id = folder.getName();
card.setId(id);
card.setName(cardProperties.getProperty(NAME));
card.setFolder(folder);
card.setIconPath(getImagePath(folder, "icon"));
card.setImagePath(getImagePath(folder, "card"));
String figures3d = cardProperties.getProperty(FIGURES_3D);
String[] figures = figures3d.split(",");
for (String figureName : figures) {
figureName = figureName.trim();
card.getFigureNames().add(figureName);
}
cardInventory.addCard(id, card, null);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
return cardInventory;
}
private String getImagePath(File folder, String name) {
for (String extension : IMAGE_TYPES) {
File file = new File(folder, name + "." + extension);
if (file.exists() && file.isFile() && file.canRead()) {
return file.getAbsolutePath();
}
}
return null;
}
public CardType getCardByPieceId(String pieceId) {
return cardInventory.getCardsByPieceId().get(pieceId);
}
public CardCollection getCardInventory() {
return cardInventory;
}
}