package de.jaujau.daten;

import java.awt.Image;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
import javax.imageio.ImageIO;


/*ToDo: 
 * lesen von Datein aus Zip in eigene Methoden auslagern
 * Fehlerprüfung nicht obtimal
 */

/**
 * Verwaltung eines Texturenpaketes
 * zu jedem Paket werden folgende Informationen gespeichert:
 * Name
 * mindes Level
 * Pfad zu der Zip-Datei
 * 
 * Aufbau eines Texturenpaketes:
 * name.zip
 * - paket.txt
 *   - name:NAME
 *   - level:LEVEL als Integer
 * - 0.png
 * - ...
 * - 31.png
 * - 32.png (Rückseite)
 * 
 * @author Sebastian Kacza
 *
 */
public class Texturenpaket {

	protected String name; //Protektet weil die abgeleitet Klasse TexturenpaketIntern auf die Werte zugreifen können muss
	protected int level;
	private final String pfad;
	
	
	/**
	 * Erstellt ein neues Texturenpackt
	 * @param Pfad zu der Zip-Datei des Texturenpaketes
	 */
	public Texturenpaket(String Pfad) {
		name = "Nicht geladen";
		level = 0;
		pfad = Pfad;
	}
	
	
	/**
	 * Läd die Packetinformationen in die lokalen Variablen und Testet das Packet auf Vollständigkeit
	 * @return Paket vollständig geladen, true/false
	 */
	public boolean ladePacket() {
		System.out.println("TEXTURENPAKET: Lade Paket");
		if(testePaket()) {
			//Paket ist OK
			
			//Paket Informationen Laden
			
			try {
				File zipDatei = new File(pfad);
				ZipFile paketDatei = new ZipFile(zipDatei);
				ZipEntry zipInhaltPaketTXT = paketDatei.getEntry("paket.txt");
				InputStream eingabeStromTXT = paketDatei.getInputStream(zipInhaltPaketTXT);
				Scanner scanner = new Scanner(eingabeStromTXT);
				while(scanner.hasNext()) {
					String Zeile = scanner.nextLine();
					//scanner.nextLine()
					//scanner.next()
					String Spalte[] = Zeile.split(":");
					//System.out.println(Spalte.length);
					if(Spalte.length==2) {
						System.out.println("TEXTURENPAKET: " + Spalte[1]);
						//Name Auslesen
						if(Spalte[0].equals("name")) {
							name = Spalte[1];
						}
						//Level Auslesen
						if(Spalte[0].equals("level")) {
							level = Integer.parseInt(Spalte[1]);
						}
						
					}
				}
				scanner.close();
				paketDatei.close();
				
			} catch (ZipException e) {
				e.printStackTrace();
				return false;
			} catch (IOException e) {
				e.printStackTrace();
				return false;
			}
			
		}
		else {
			return false;
		}
		return true;
	}
	
	
	/**
	 * Gibt alle Bilddatein von dem Texturenpaket als Image Array zurück
	 * @return Image Array der Texturen des Paketes
	 */
	public Image[] getTexturen() {
		if(testePaket()) {
			
			try {
				File zipDatei = new File(pfad);
				ZipFile paketDatei = new ZipFile(zipDatei);
				Image Bilder[] = new Image[33];
				
				for(int i = 0; i < 33; i++) {
					ZipEntry zipInhaltTextur = paketDatei.getEntry(i+".png");
					InputStream eingabeStromTextur = paketDatei.getInputStream(zipInhaltTextur);
					Bilder[i] = ImageIO.read(eingabeStromTextur);
				}
				paketDatei.close();
				return Bilder;
				
				
			} catch (ZipException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}

		}
		return null;
	}
	
	
	/**
	 * Gibt den Namen des Texturenpacket zurück
	 * @return Name des Texturenpacketes
	 */
	public String getName() {
		return name;
	}
	
	
	/**
	 * Gibt den Level Wert zurück der mindestens Benötigt wird um das Packet zu benutzten
	 * @return Mindest Level
	 */
	public int getLevel() {
		return level;
	}
	
	
	/**
	 * Testet das Texturenpaket auf vollständigkeit
	 * @return Paket vollständig, true/false
	 */
	private boolean testePaket() {
		System.out.println("TEXTURENPAKET: Paket auf Fehler untersuchen:");
		//Testen ob Zip-Datei vorhanden und lesabar ist
		File zipDatei = new File(pfad);
		if(zipDatei.exists() || zipDatei.canRead()) {
			
			try {
				//Zip Datei öffnen
				ZipFile paketDatei = new ZipFile(zipDatei);
				
				//Paket Konfigurations Datei Prüfen
				ZipEntry zipInhaltPaketTXT = paketDatei.getEntry("paket.txt");
				InputStream eingabeStromTXT = paketDatei.getInputStream(zipInhaltPaketTXT);
				Scanner scanner = new Scanner(eingabeStromTXT);
				boolean PaketName = false;
				boolean PaketLevel = false;
				while(scanner.hasNext()) {
					//Prüfen ob Konfigurations Datei die Einträge "name" und "level" enthält	
					String Zeile = scanner.nextLine();
					System.out.println("TEXTURENPAKET: Konfigzeile:" + Zeile);
					if(Zeile.contains("name:")) {
						PaketName = true;
					}
					if(Zeile.contains("level:")) {
						PaketLevel = true;
					}
				}
				scanner.close();
				if(!PaketName || !PaketLevel) {
					System.out.println("TEXTURENPAKET: Paket Konfiguration fehlerhaft");
					paketDatei.close();
					return false;
				}
				
				//Texturen Prüfen
				for(int i = 0; i < 33; i++) {
					ZipEntry zipInhaltTextur = paketDatei.getEntry(i+".png");
					InputStream eingabeStromTextur = paketDatei.getInputStream(zipInhaltTextur);
					Image bild = ImageIO.read(eingabeStromTextur);
					if(bild == null) {
						System.out.println("TEXTURENPAKET: Datei: " + i + ".png nicht gefunden");
						return false;
					}
					System.out.println("TEXTURENPAKET: Datei: " + i + ".png OK!");
				}
				
				paketDatei.close();
				
			} catch (ZipException e) {
				//Zip Datei nicht leesbar
				e.printStackTrace();
				return false;
			} catch (IOException e) {
				//Zip Datei nicht lesbar
				e.printStackTrace();
				return false;
			}
			
		}
		else {
			return false;
		}
		
		//Alles OK
		System.out.println("TEXTURENPAKET: Texturen Paket ist OK");
		return true;
	}
}
