package navale;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Scanner;

public class Jeu {

	/* On demande un programme, donc une méthode main
	 * Pour plus de clarte, on divise le programme en trois methodes statiques,
	 * Une pour la mise en place, l'autre pour l'attaque et la derniere pour la defense
	 */
	public static void main(String[] args) {
		int tours=0;
		miseEnPlace();	
		while(true){
			tours++;
			attaque();
			if(plateau.estVide()){
				System.out.println("Fin du jeu en "+tours+" tours");
				return;
			}
			defense();
		}
		
	}

	/* Les données suivantes sont utiles aux différentes parties du programme,
	 * pour que chacune puisse y accéder on les place en attributs statiques
	 * de la classe.
	 *
	 */
	private static Plateau plateau = new Plateau(10,10);
	private static Croiseur[] croiseurs=new Croiseur[3];
	private static SousMarin s=null;
	private static Scanner clavier = new Scanner(System.in);

	private static void miseEnPlace(){
		int x;
		int y;
		char h;
		//Placement des croiseurs
		for(int i=0; i<3; i++){
			do{
				System.out.println("Croiseur No "+(i+1)+" : [x] [y] h/v]");
				x =clavier.nextInt();
				y =clavier.nextInt();
				h = clavier.next().charAt(0);
				croiseurs[i] = new Croiseur(x,y,h=='h');
			}while( (h!='h' && h!='v') || !plateau.ajouteBateau(croiseurs[i]));
			//Si le format est mauvais ou si le placement echoue, on recommence
		}
		
		//Placement du sous-marin
		do{
			System.out.println("Sous-marin : [x] [y]");
			x =clavier.nextInt();
			y =clavier.nextInt();
			s= new SousMarin(x,y);
		}while( !plateau.ajouteBateau(s));		
	}
	
	private static void attaque(){
		//debug
		System.out.println(plateau);
		//fin debug
		System.out.println("Attaque : [x] [y]");
		int x =clavier.nextInt();
		int y =clavier.nextInt();
		switch(plateau.coup(x,y)){
		case 0: System.out.println("Coup dans l'eau"); break;
		case 1: System.out.println("Croiseur touché"); break;
		case 2: System.out.println("Croiseur coulé"); break;
		case 3: System.out.println("Sous-marin coulé"); break;
		}
	}
	
	private static void defense(){
		System.out.println("Action des bateaux :\n"+
				"Rien : 0\n"+
				"Déplacer croiseur : [i] [d]\n"+
				"Déplacer sous-marin : 4 m [dx] [dy]\n"+
				"Sous-marin plonge : 4 p\n"+
				"Sous-marin émerge : 4 s\n"+
				//Exercice 6
				"Sauvegarder : 5 [nom]\n"+
				"Charger : 6 [nom]"		
				);
		int i=clavier.nextInt();
		switch(i){
		case 1: case 2: case 3:
			plateau.deplace(croiseurs[i-1], clavier.nextInt());
			break;
		case 4:
			char c=clavier.next().charAt(0);
			switch(c){
			case 'p' : plateau.plonge(s); break;
			case 's' : plateau.surface(s); break;
			case 'm' :
				int x=clavier.nextInt();
				int y=clavier.nextInt();
				plateau.deplace(s, x, y);
			}
			break;
		//Exercice 6:
		case 5:
			String nom = clavier.next();
			try {
					sauvegarde(nom);
				} catch (IOException e) {
					System.out.println("Erreur entrée/sortie");
					e.printStackTrace();
				}
			break;
		case 6:
			nom = clavier.next();
			try {
					charge(nom);
				} catch (IOException e) {
					System.out.println("Erreur entrée/sortie");
				}
			break;
		}
	}
	
	//Exercice 6
	private static void charge(String nom) throws IOException{
		FileInputStream input = null;
		try {
			input = new FileInputStream(nom);
			ObjectInputStream oInput = new ObjectInputStream(input);
			plateau = (Plateau)oInput.readObject();
		} catch (FileNotFoundException e) {
			System.out.println("Ce fichier n'existe pas");
		} catch (ClassNotFoundException e) {
			System.out.println("Ce fichier ne stocke pas une partie");
		} finally {
			if(input!=null)
				input.close();
		}
	}
	
	private static void sauvegarde(String nom) throws IOException{
		FileOutputStream output = null;
		try {
			output = new FileOutputStream(nom);
			ObjectOutputStream oOutput = new ObjectOutputStream(output);
			oOutput.writeObject(plateau);
		} finally {
			if(output!=null)
				output.close();
		}
	}
	
}
