package system.loaders;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

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

/**
 * Classe utilizada para salvar databases 
 * */
public class DatabaseSaver implements Jogada {
	private static final long serialVersionUID = -9044136888365324474L;
	
	/**
	 * 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/";
	/**
	 * Nome do arquivo propriamente dito
	 * */
	private String fileName;
	
	public DatabaseSaver(String fileName) {
		this.fileName = filePath + fileName + databaseExtension;
	}
	
	public void saveDatabase (Object[] objects) {
		String file = fileName;
		
		try(FileOutputStream fileOutput = new FileOutputStream(file)) {
			try(ObjectOutputStream objectOutput = new ObjectOutputStream(fileOutput)) {
				
				objectOutput.writeObject(objects);
				
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		
		//DatabaseSaver characterSaver = new DatabaseSaver("characters");
		//DatabaseSaver itemSaver = new DatabaseSaver("items");
		//DatabaseSaver equipmentSaver = new DatabaseSaver("equipments");
		DatabaseSaver skillSaver = new DatabaseSaver("skills");
		DatabaseSaver afflictionSaver = new DatabaseSaver("afflictions");
		//DatabaseSaver audioSaver = new DatabaseSaver("audios");
		//DatabaseSaver sceneSaver = new DatabaseSaver("scenes");
		//DatabaseSaver mapSaver = new DatabaseSaver("maps");
	
		// ----------------------------------------------------------------------------
		Affliction asd1 = new Affliction(0, -1, "KO");
		Affliction asd2 = new Affliction(1, 5, "Poisoned");
		Affliction asd3 = new Affliction(2, 3, "Burned");
		Affliction asd4 = new Affliction(3, 3, "Confused");
		Affliction asd5 = new Affliction(4, 4, "Sleeping");
		Affliction asd6 = new Affliction(5, 2, "Frozen");
		Affliction asd7 = new Affliction(6, 3, "Shocked");
		Affliction asd8 = new Affliction(7, 2, "Paralyzed");
		Affliction asd9 = new Affliction(8, 4, "Blind");
		
		asd1.getTraits().setRestricted(true);		
		
		asd2.getTraits().setHpRegenRate(-0.05);
		
		asd3.getTraits().setHpRegenRate(-0.11);
		
		asd4.getTraits().setAutoBattle(true);
		
		asd5.getTraits().setRestricted(true);
		asd5.getTraits().setHpRegenRate(0.02);
		asd5.getTraits().setMpRegenRate(0.02);
		asd5.getTraits().setDefenseModifier(0.8);
		asd5.getTraits().setEvasionModifier(0);
		
		asd6.getTraits().setRestricted(true);
		asd6.getTraits().setEvasionModifier(0);
		
		asd7.getTraits().setEvasionModifier(0);
		
		asd8.getTraits().setRestricted(true);
		asd8.getTraits().setEvasionModifier(0);
				
		asd9.getTraits().setAccuracyModifier(0.7);
		
		Affliction[] afflictionsToBeSaved = new Affliction[]{asd1, asd2, asd3, asd4, asd5, asd6, asd7, asd8, asd9};
		// ----------------------------------------------------------------------------
		boolean[] melee = new boolean[]{true, false, true, false, false, false, false, false};
		boolean[] meleeWind = new boolean[]{true, false, true, false, false, false, true, false};
		
		boolean[] ranged = new boolean[]{false, true, true, false, false, false, false, false};
		boolean[] rangedFire = new boolean[]{false, true, false, true, false, false, false, false};
		
		Effect effectHp = new Effect(false, true, false, false, false, false, true, false, true, null, null);
		Effect effectMp = new Effect(false, false, false, false, false, false, false, true, true, null, null);
		
		Effect criticalMelee = new Effect(false, false, false, true, false, false, true, false, false, melee, null);
		Effect criticalMeleeDrain = new Effect(false, false, false, true, false, true, true, false, false, melee, null);
		Effect criticalMeleeWind = new Effect(false, false, false, true, false, false, true, false, false, meleeWind, null);
		
		Effect criticalRanged = new Effect(false, false, false, true, false, false, true, false, false, ranged, null);
		Effect criticalRangedFire = new Effect(false, false, false, true, false, false, true, false, false, rangedFire, null);
		
		String skill1Desc = "Ataque de curta distância em um oponente";
		String skill2Desc = "Ataque de curta distância em um oponente";
		String skill3Desc = "Ataque de curta distância em um oponente";
		String skill4Desc = "Ataque de curta distância em um oponente";
		String skill5Desc = "Ataque de curta distância em um oponente";
		String skill6Desc = "Ataque de longa distância em um oponente";
		String skill7Desc = "Ataque de longa distância em um oponente";
		String skill8Desc = "Ataque de longa distância em área";
		
		String skill9Desc = "Cura em torno de 40 Hp em área";
		String skill10Desc = "Cura em torno de 10 Mp em área";
		String skill9_1Desc = "Cura em torno de 100 Hp em área";
		String skill10_1Desc = "Cura em torno de 30 Mp em área";
		String skill9_2Desc = "Cura em torno de 230 Hp para um alvo";
		String skill10_2Desc = "Cura em torno de 75 Mp para um alvo";
		
		String skill1_1Desc = "Desfere 3 ataques contra um oponente";
		String skill2_1Desc = "Desfere ataques consecutivos contra um alvo";
		String skill3_1Desc = "Ataca um alvo com um golpe poderoso";
		String skill4_1Desc = "Desfere um golpe devastador contra um alvo conforme o Hp Atual do usuário";
		String skill5_1Desc = "Ataca uma área ao redor do usuário";
		String skill6_1Desc = "Ataca um alvo distante duas vezes";
		String skill7_1Desc = "Metralha um alvo distante";
		String skill8_1Desc = "Dispara contra uma área";
		
		String skill1_2Desc = "Atira o escudo para causar dano em um alvo à distância";
		String skill2_2Desc = "Ataca um alvo diversas vezes";
		String skill3_2Desc = "Ataca um alvo e drena seu Hp";
		String skill4_2Desc = "Desfere um ataque contra uma linha de alvos";
		String skill5_2Desc = "Ataca um alvo com um dano consistente";
		String skill6_2Desc = "Dispara contra uma área";
		String skill7_2Desc = "Dispara contra uma linha inteira de alvos";
		String skill8_2Desc = "Explode uma grande área próxima do usuário";
		
		Skill skill1 = new Skill(0, "Ataque de Sword and Shield", 0, 0, 0, 1, 1, 40, 1, 20, 95.0, 1.0, null, criticalMelee, "Attack", "Cardinal", "Singular", true, skill1Desc);
		Skill skill2 = new Skill(1, "Ataque de Lance and Shield", 0, 0, 0, 2, 1, 40, 1, 5, 100.0, 1.0, null, criticalMelee, "Attack", "Cardinal", "Singular", true, skill2Desc);
//		Skill skill3 = new Skill(2, "Ataque de Great Sword", 0, 0, 0, 2, 1, 40, 1, 25, 85.0, 0.9, null, criticalMelee, "Attack", "Cardinal", "StraightAll", true, skill3Desc);
		Skill skill4 = new Skill(3, "Ataque de Long Sword", 0, 0, 0, 2, 1, 40, 1, 10, 90.0, 1.0, null, criticalMelee, "Attack", "Cardinal", "Singular", true, skill4Desc);
		Skill skill5 = new Skill(4, "Ataque de Hammer", 0, 0, 0, 1, 1, 40, 1, 35, 80.0, 1.1, null, criticalMelee, "Attack", "Cardinal", "Singular", true, skill5Desc);
		Skill skill6 = new Skill(5, "Ataque de Bow", 0, 0, 2, 4, 1, 40, 1, 30, 85.0, 0.8, null, criticalRanged, "Attack", "Circular", "Singular", true, skill6Desc);
		Skill skill7 = new Skill(6, "Ataque de LBG", 0, 0, 2, 5, 1, 40, 1, 10, 90.0, 0.65, null, criticalRanged, "Attack", "Circular", "Singular", true, skill7Desc);
		Skill skill8 = new Skill(7, "Ataque de HBG", 0, 0, 1, 3, 1, 40, 1, 40, 80.0, 0.4, null, criticalRanged, "Attack", "Circular", "Circular", true, skill8Desc);
		
		Skill skill9 = new Skill(8, "Poção de Hp", 0, 0, 40, 0, 2, 40, 1, 20, 100.0, 1.0, null, effectHp, "Item", "Circular", "Circular", false, skill9Desc);
		Skill skill10 = new Skill(9, "Poção de Mp", 0, 0, 10, 0, 2, 40, 1, 20, 100.0, 1.0, null, effectMp, "Item", "Circular", "Circular", false, skill10Desc);
		Skill skill9_1 = new Skill(10, "Poção Maior de Hp", 0, 0, 100, 0, 2, 50, 1, 25, 100.0, 1.0, null, effectHp, "Item", "Circular", "Circular", false, skill9_1Desc);
		Skill skill10_1 = new Skill(11, "Poção Maior de Mp", 0, 0, 30, 0, 2, 50, 1, 25, 100.0, 1.0, null, effectMp, "Item", "Circular", "Circular", false, skill10_1Desc);
		Skill skill9_2 = new Skill(12, "Cachaça de Hp", 0, 0, 230, 0, 1, 65, 1, 30, 100.0, 1.0, null, effectHp, "Item", "Circular", "Singular", false, skill9_2Desc);
		Skill skill10_2 = new Skill(13, "Cachaça de Mp", 0, 0, 75, 0, 1, 65, 1, 30, 100.0, 1.0, null, effectMp, "Item", "Circular", "Singular", false, skill10_2Desc);
		
		Skill skill1_1 = new Skill(14, "Combo Triplo", 15, 0, 0, 1, 1, 60, 3, 10, 90.0, 0.45, null, criticalMelee, "Attack", "Cardinal", "Singular", true, skill1_1Desc);
		Skill skill2_1 = new Skill(15, "Perfurar em Espiral", 25, 0, 0, 2, 1, 60, 5, 20, 90.0, 0.3, null, criticalMelee, "Attack", "Cardinal", "Singular", true, skill2_1Desc);
		Skill skill3_1 = new Skill(16, "Impacto Fulminante", 25, 0, 0, 2, 1, 50, 1, 15, 90.0, 1.2, null, criticalMelee, "Attack", "Cardinal", "Singular", true, skill3_1Desc);
		Skill skill4_1 = new Skill(17, "Ataque Mortal", 25, 50, 0, 1, 1, 60, 1, 15, 90.0, 1.5, null, criticalMelee, "CurrentHp", "Cardinal", "Singular", true, skill4_1Desc);
		Skill skill5_1 = new Skill(18, "Terremoto", 20, 0, 1, 2, 1, 65, 1, 25, 85.0, 1.1, null, criticalMelee, "Defense", "Circular", "Circular", true, skill5_1Desc);
		Skill skill6_1 = new Skill(19, "Disparo Duplo", 15, 5, 2, 4, 1, 50, 2, 30, 80.0, 0.55, null, criticalRanged, "Attack", "Circular", "Singular", true, skill6_1Desc);
		Skill skill7_1 = new Skill(20, "Rajada Certeira", 20, 0, 2, 5, 1, 65, 4, 10, 80.0, 0.25, null, criticalRanged, "Attack", "Circular", "Singular", true, skill7_1Desc);
		Skill skill8_1 = new Skill(21, "Controle de Multidão", 30, -5, 1, 3, 1, 60, 1, 20, 85.0, 0.55, null, criticalRanged, "Attack", "Circular", "Circular", true, skill8_1Desc);
		
		Skill skill1_2 = new Skill(22, "Escudo Bumerangue", 25, 0, 1, 3, 1, 70, 1, 20, 85.0, 1.0, null, criticalMelee, "Defense", "Circular", "Singular", true, skill1_2Desc);
		Skill skill2_2 = new Skill(23, "Lança das Mil Pontas", 40, 0, 0, 1, 1, 85, 7, 15, 80.0, 0.4, null, criticalMelee, "Attack", "Cardinal", "Singular", true, skill2_2Desc);
		Skill skill3_2 = new Skill(24, "Ataque Vital", 50, 0, 0, 1, 1, 80, 1, 25, 85.0, 0.65, null, criticalMeleeDrain, "Attack", "Cardinal", "Singular", true, skill3_2Desc);
//		Skill skill4_2 = new Skill(25, "Lâmina de Vento", 30, 0, 0, 4, 1, 70, 1, 25, 70.0, 1.0, null, criticalMeleeWind, "Speed", "Cardinal", "StraightAll", true, skill4_2Desc);
		Skill skill5_2 = new Skill(26, "Quebra-ossos", 45, 75, 0, 1, 1, 80, 1, 15, 95.0, 0.2, null, criticalMelee, "Attack", "Cardinal", "Singular", true, skill5_2Desc);
		Skill skill6_2 = new Skill(27, "Rajada de Flechas", 55, 0, 2, 4, 1, 80, 1, 20, 85.0, 0.15, null, criticalRanged, "Attack", "Circular", "Circular", true, skill6_2Desc);
//		Skill skill7_2 = new Skill(28, "Disparo Perfurante", 55, 0, 0, 4, 1, 75, 1, 10, 90.0, 0.65, null, criticalRanged, "Attack", "Cardinal", "StraightAll", true, skill7_2Desc);
		Skill skill8_2 = new Skill(29, "Explosão Descomunal", 65, 10, 1, 2, 2, 80, 1, 50, 75.0, 0.3, null, criticalRangedFire, "Attack", "Circular", "Circular", true, skill8_2Desc);
		
		Skill[] skillsToBeSaved = new Skill[]{
				skill1, skill2, skill1, skill4, skill5, skill6, skill7, skill8,// skill9, skill10, // Ataques básicos
				skill9_1, skill10_1, skill9_2, skill10_2, // Itens consumíveis
				skill1_1, skill2_1, skill3_1, skill4_1, skill5_1, skill6_1, skill7_1, skill8_1, // Skills 1
				skill1_2, skill2_2, skill3_2, skill5_2, skill6_2, skill8_2, skill1, skill1}; // Skills 2
		// ----------------------------------------------------------------------------
		//itemSaver.saveDatabase(new Item[1]);
		//equipmentSaver.saveDatabase(new Equipment[1]);
		afflictionSaver.saveDatabase(afflictionsToBeSaved);
		skillSaver.saveDatabase(skillsToBeSaved);
		
	}
}
