package system.loaders;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;

import br.ufsc.inf.leobr.cliente.Jogada;
import system.item.skill.Affliction;

/**
 * <b>IT. JUST. FUNCIONA.</b>
 */
public class DatabaseLoader implements Jogada {
	private static final long serialVersionUID = -3255662051068180709L;
	
	/**
	 * Nome da extensão dos arquivos que servirão como banco de dados
	 * */
	private static final String databaseExtension = ".database";
	/**
	 * Nome do caminho em que os arquivos serão salvos
	 * */
	private static final String filePath = "src/system/databases/";
	
	/**
	 * Carrega um arquivo .database inteiro para um objeto.
	 * @param fileName - o nome da database a ser carregada, sem extensões e sem <i>filepath</i>.
	 * @return um Object[] que deve receber seu devido casting para o tipo desejado.
	 */
	public static Object[] loadDatabase (String fileName) {
		String file = filePath + fileName + databaseExtension;
		Object[] arrayToBeReturned = new Object[1];
		
		try(FileInputStream fileInput = new FileInputStream (file)) {
			try(ObjectInputStream objectInput = new ObjectInputStream(fileInput)) {
				arrayToBeReturned = (Object[]) objectInput.readObject();
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return arrayToBeReturned;
	}
	
	/**
	 * Carrega um item de uma database para um objeto.<br>
	 * Pode (ou deve) estar mal otimizado, mas funciona do jeito que eu quero, logo foda-se.
	 * @param fileName - o nome da database a ser carregada, sem extensões e sem <i>filepath</i>.
	 * @param id - o id do item a ser carregado da database.
	 * @return um Object que deve receber seu devido casting para o tipo desejado.
	 */
	public static Object loadDatabaseElement (String fileName, int id) {
		String file = filePath + fileName + databaseExtension;
		Object[] arrayToBeReturned = new Object[1];
		
		try(FileInputStream fileInput = new FileInputStream (file)) {
			try(ObjectInputStream objectInput = new ObjectInputStream(fileInput)) {
				arrayToBeReturned = (Object[]) objectInput.readObject();
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return arrayToBeReturned[id];
	}

	public static void main(String[] args) {
		
		//DatabaseLoader qwe = new DatabaseLoader("afflictions");

		// TEM QUE FAZER A PORRA DO CAST PARA O TIPO DESEJADO SEU CABAÇO
		Affliction[] asd = (Affliction[]) DatabaseLoader.loadDatabase("afflictions");
		
		for (int i = 0; i < asd.length; i++) {
			System.out.println(asd[i].getName());			
		}
		
		Affliction qwe = (Affliction) DatabaseLoader.loadDatabaseElement("afflictions", 1);
		System.out.println("\n"+qwe.getName());
	}
}
