package de.greifintegra.kontor.extras.archiv.logik;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;

import de.greifintegra.kontor.crypt.AES;
import de.greifintegra.kontor.crypt.Einlesen;
import de.greifintegra.kontor.enums.DatenEnum;
import de.greifintegra.kontor.extras.tabellendatenobjekte.Teilnehmer;
import de.greifintegra.kontor.logik.AktionDatenbank;
import de.greifintegra.kontor.logik.PhpKontakt;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.TextArea;

public class ArchivTeilnehmerAktion
{
	public static ObservableList<Teilnehmer> leseDatenTabelle(TextArea zustandDatenbank)
	{
		ObservableList<Teilnehmer> daten = FXCollections.observableArrayList();
		
		String url = Einlesen.lese(DatenEnum.internet);
		String ordner = Einlesen.lese(DatenEnum.phpOrdner);
		String name = Einlesen.lese(DatenEnum.phpAdminName);
		String kennwort = Einlesen.lese(DatenEnum.phpAdminKennwort);
		
		PhpKontakt con;
		String antwort = null;
		try 
		{
			con = new PhpKontakt("http://" +url+ "/" + ordner+ "/" + "admin/abfrage_teilnehmer_uebersicht.php", name, kennwort);
			con.send("0=1", true);
			antwort = con.read(true);
		}
		catch (IOException e) 
		{
			zustandDatenbank.setText("FEHLER Tabelle kann nicht gelesen werden\n"+e.getLocalizedMessage());
		}
		
		if(antwort == null)
		{
			String antwort2 = new AktionDatenbank().kontaktierenNutzer();
			if(antwort2.contains("OKAY")) zustandDatenbank.setText("OKAY Tabelle ist leer");
			else zustandDatenbank.setText(antwort2);
		}
		else
		{
			antwort = antwort.replace("\\x00", "\u0000");
			antwort = antwort.replace("\\x07", "\u0007");
			
			String[] zeilen = antwort.split("\u0007");
			String[][] zeilenSpalten = new String[zeilen.length][5];

			String datenkennwort = Einlesen.lese(DatenEnum.datenKennwort);
			if(datenkennwort.length() == 0)
			{
				zustandDatenbank.setText("FEHLER Datenkennwort fehlt");
				return daten;
			}
			SecretKeySpec schlüsselDaten = null;
			try 
			{
				schlüsselDaten = AES.macheSchlüssel(datenkennwort);
			}
			catch (NoSuchAlgorithmException | UnsupportedEncodingException e) 
			{
				zustandDatenbank.setText("FEHLER Datenschlüssel defekt\n"+e.getLocalizedMessage());
				return daten;
			}
			
			for(int i=0; i<zeilen.length; i++)
			{
				// Wenn am Ende ein Datum fehlt, muß Platz dafür hergestellt werden
				if(zeilen[i].endsWith("\u0000")) zeilen[i] = zeilen[i].concat(" ");
				
				zeilenSpalten[i] = zeilen[i].split("\u0000");
				
				try 
				{
					daten.add(new Teilnehmer(Integer.parseInt(zeilenSpalten[i][0]),
											 AES.entschlüsseleString(zeilenSpalten[i][1], schlüsselDaten),
											 AES.entschlüsseleString(zeilenSpalten[i][2], schlüsselDaten),
											 (zeilenSpalten[i][3].equals("1"))?true:false,
											 AES.entschlüsseleString(zeilenSpalten[i][4].trim(), schlüsselDaten),
											 Integer.parseInt(zeilenSpalten[i][5])));
				}
				catch (InvalidKeyException | NoSuchAlgorithmException | NoSuchPaddingException
						| IllegalBlockSizeException | BadPaddingException | IOException | NumberFormatException | InvalidAlgorithmParameterException e)
				{
					zustandDatenbank.setText("FEHLER Entschlüsselung der Daten fehlgeschlagen\n"+e.getLocalizedMessage());
					return daten;
				}
			}
			zustandDatenbank.setText("OKAY Tabelle konnte gelesen werden");
		}
		
		return daten;
	}
}
