package de.jaujau.gui;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

import de.jaujau.daten.Farbe;
import de.jaujau.daten.Spieler;
import de.jaujau.daten.Spielerverwaltung;
import de.jaujau.daten.Texturenpakete;
import de.jaujau.spiellogik.Spiel;
import javax.swing.JLabel;
import java.awt.Dimension;
import java.awt.Image;
import javax.swing.JComboBox;
import javax.swing.SwingConstants;
import javax.swing.ImageIcon;
import java.awt.Rectangle;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.ComponentOrientation;
import java.awt.Cursor;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.UIManager;
import java.awt.Font;
import javax.swing.JButton;

public class Dashboard_GUI extends JPanel{
	private static final long serialVersionUID = -7380187913989942586L;
	JPanel panelCont = new JPanel();
	JPanel highscore = new JPanel();
	JPanel game = new JPanel();
	JPanel start = new JPanel();
	CardLayout cl = new CardLayout();
	Spielerverwaltung spielerverwaltung = new Spielerverwaltung();
	private final JPanel panel = new JPanel();
	private final JPanel panel_1 = new JPanel();
	private JComboBox<String> comboBox = new JComboBox<String>();
	private final JPanel panel_2 = new JPanel();
	private final JLabel lblNewLabel_1 = new JLabel("Entwickler: Sebastian, Moritz, Fabian, Aladin, Elmar");
	private final JPanel spielfeld = new JPanel();
	private final JPanel player_hand = new JPanel();
	private final JPanel gegner_hand = new JPanel();
	private final JLabel ziehstapel = new JLabel("");
	JPanel spielerkarten = new JPanel();
	JLabel labels[] = new JLabel[32];
	private Spiel aktuellesSpiel;
	private JLabel label_aktuellerSpieler;
	private Texturenpakete texturenpakete;
	private final JPanel spielfeldmitte = new JPanel();
	private final JPanel info_panel = new JPanel();
	private final JPanel rechts = new JPanel();
	private final JPanel mitte = new JPanel();
	JLabel ablagestapel = new JLabel("");
	JButton aussetzen = new JButton("Aussetzen");
	JPanel mitte_unten = new JPanel();
	JPanel mitte_center = new JPanel();
	private JPanel mitte_oben = new JPanel();
	private JButton btnherz = new JButton("Herz");
	private JButton btnpik = new JButton("Pik");
	private JButton btnkaro = new JButton("Karo");
	private JButton btnkreuz = new JButton("Kreuz");
	private final JLabel label_final = new JLabel("Spiel beendet");
	
	public Dashboard_GUI(Spiel Spiel, Texturenpakete texturen) {
		setMinimumSize(new Dimension(1000, 600));
		texturenpakete = texturen;
		texturenpakete.addPaket("StandartTexturenBeta3.zip");
		texturenpakete.setAktivesPaket(0);
		System.out.println(texturenpakete.getAktivesPaket());
		aktuellesSpiel = Spiel;
		setLayout(new BorderLayout(0, 0));
		panelCont.setLayout(cl);
		panelCont.add(highscore, "1");
		panelCont.add(game, "2");
		game.setLayout(new BorderLayout(0, 0));
		spielfeld.setBackground(new Color(128, 128, 128));
		
		game.add(spielfeld, BorderLayout.CENTER);
		spielfeld.setLayout(new BorderLayout(0, 0));
		player_hand.setPreferredSize(new Dimension(100, 240));
		player_hand.setForeground(new Color(169, 169, 169));
		player_hand.setBackground(new Color(169, 169, 169));
		
		spielfeld.add(player_hand, BorderLayout.SOUTH);
		player_hand.setLayout(new BorderLayout(0, 0));
		
		JScrollPane scrollPane_1 = new JScrollPane();
		scrollPane_1.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
		scrollPane_1.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
		scrollPane_1.setPreferredSize(new Dimension(100, 240));
		player_hand.add(scrollPane_1, BorderLayout.CENTER);
		spielerkarten.setBackground(new Color(169, 169, 169));
		
		
		spielerkarten.setAutoscrolls(true);
		spielerkarten.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
		scrollPane_1.setViewportView(spielerkarten);
		spielerkarten.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
		gegner_hand.setBackground(UIManager.getColor("Button.shadow"));
		
		spielfeld.add(gegner_hand, BorderLayout.NORTH);
		gegner_hand.setLayout(new BorderLayout(0, 0));
		
		spielfeldmitte.setPreferredSize(new Dimension(100, 20));
		spielfeldmitte.setLayout(new BorderLayout(0, 0));
		
		JLabel beschreibung_aktuellerSpieler = new JLabel("Aktueller Spieler:");
		beschreibung_aktuellerSpieler.setFont(new Font("Tahoma", Font.BOLD, 18));
		beschreibung_aktuellerSpieler.setForeground(Color.BLACK);
		info_panel.add(beschreibung_aktuellerSpieler);
		label_aktuellerSpieler = new JLabel("Auswahlphase");
		label_aktuellerSpieler.setForeground(Color.BLACK);
		label_aktuellerSpieler.setFont(new Font("Tahoma", Font.BOLD, 18));
		info_panel.add(label_aktuellerSpieler);
		
		
		spielfeld.add(spielfeldmitte, BorderLayout.CENTER);
		
		spielfeldmitte.add(info_panel, BorderLayout.NORTH);
		rechts.setPreferredSize(new Dimension(250, 10));
		
		spielfeldmitte.add(rechts, BorderLayout.EAST);
		rechts.setLayout(new BorderLayout(0, 0));
		ziehstapel.setAlignmentX(Component.CENTER_ALIGNMENT);
		rechts.add(ziehstapel, BorderLayout.CENTER);
		ziehstapel.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				aktuellesSpiel.karteZiehen();
				aktualisiereGUI();
			}
		});
		ziehstapel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
		ziehstapel.setPreferredSize(new Dimension(242, 362));
		ziehstapel.setHorizontalAlignment(SwingConstants.CENTER);
		ziehstapel.setIcon(new ImageIcon(texturenpakete.getTextur(32).getScaledInstance(150, 210, Image.SCALE_SMOOTH)));
		
		spielfeldmitte.add(mitte, BorderLayout.CENTER);
		aussetzen.setVisible(false);
		aussetzen.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				aussetzen.setVisible(false);
				aktuellesSpiel.aussetzen();	
			}
		});
		mitte.setLayout(new BorderLayout(0, 0));
		mitte_unten.setPreferredSize(new Dimension(150, 50));
		mitte_unten.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
		btnherz.setVisible(false);

		
		mitte_unten.add(btnherz);
		mitte_unten.add(aussetzen);
		mitte_center.setLayout(new BorderLayout(0, 0));
		ablagestapel.setHorizontalAlignment(SwingConstants.CENTER);
		ablagestapel.setHorizontalTextPosition(SwingConstants.CENTER);
		ablagestapel.setAlignmentX(Component.CENTER_ALIGNMENT);
		
		
		ablagestapel.setIcon(new ImageIcon(texturenpakete.getTextur(32).getScaledInstance(150, 210, Image.SCALE_SMOOTH)));
		mitte_center.add(ablagestapel, BorderLayout.CENTER);
		
		
		mitte.add(mitte_center);
		label_final.setVisible(false);
		label_final.setFont(new Font("Tahoma", Font.PLAIN, 34));
		label_final.setHorizontalAlignment(SwingConstants.CENTER);
		label_final.setForeground(Color.BLACK);
		
		mitte_center.add(label_final, BorderLayout.SOUTH);
		
		//Wunschfarben Button Listener
		
		mitte.add(mitte_unten, BorderLayout.SOUTH);
		btnpik.setVisible(false);
		btnpik.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				aktuellesSpiel.getKartensatz().SetWunschfarbe(Farbe.PIK);
				showwunsch(false);
			}
		});
		
		mitte_unten.add(btnpik);
		btnkaro.setVisible(false);
		btnkaro.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				aktuellesSpiel.getKartensatz().SetWunschfarbe(Farbe.KARO);
				showwunsch(false);
			}
		});
		
		mitte_unten.add(btnkaro);
		btnkreuz.setVisible(false);
		btnkreuz.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				aktuellesSpiel.getKartensatz().SetWunschfarbe(Farbe.KREUZ);
				showwunsch(false);
			}
		});
		
		btnherz.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				aktuellesSpiel.getKartensatz().SetWunschfarbe(Farbe.HERZ);
				showwunsch(false);
			}
		});
		
		mitte_unten.add(btnkreuz);
		mitte_oben.setPreferredSize(new Dimension(150, 50));
		
		mitte.add(mitte_oben, BorderLayout.NORTH);
		mitte_oben.setLayout(new BorderLayout(0, 0));
		panelCont.add(start, "3");
		start.setLayout(new BorderLayout(0, 0));
		panel.setPreferredSize(new Dimension(10, 30));
		
		start.add(panel, BorderLayout.NORTH);
		
		JLabel lblNewLabel = new JLabel("Spielername:");
		panel.add(lblNewLabel);
		comboBox.setMinimumSize(new Dimension(60, 22));
		comboBox.setEditable(true);
		panel.add(comboBox);
		start.add(panel_1, BorderLayout.CENTER);
		
		start.add(panel_2, BorderLayout.SOUTH);
		
		panel_2.add(lblNewLabel_1);

		highscore.setLayout(new BorderLayout(0, 0));
		
		//Erstes Panel wird angezeigt
		cl.show(panelCont, "3");
		add(panelCont);	
		renderStart(); //Startseite beim ersten öffnen aktualisieren
	}

	//Spiel Panel wird gezeigt
	public void showgame(Spiel Spiel){
		//Neues Spiel wird übergeben
		aktuellesSpiel = Spiel;
		System.out.println("DASHBOARD: Game darstellen");
		cl.show(panelCont, "2");
		showwunsch(false);
		aussetzen.setVisible(false);
		aktuellesSpiel.spiel(this);
		aktualisiereGUI();
	}
	
	public void showstart(){
		System.out.println("DASHBOARD: Start darstellen");
		cl.show(panelCont, "3");
		renderStart();
	}
	
	
	public void showhighscore(){
		System.out.println("DASHBOARD: Highscore darstellen");
		renderHighscore();
		cl.show(panelCont, "1");
		repaint();
		revalidate();
	}
	
	
	
		public void renderStart(){
			comboBox.removeAllItems();
			for(int i = 0; i<spielerverwaltung.gethighscoreTabelle().length; i++) {
				comboBox.addItem(spielerverwaltung.gethighscoreTabelle()[i][0]);	
			}
			
		}
	
	// Highscore Tabelle
		public void renderHighscore() {
			
			
			
			String[][] rowData = spielerverwaltung.gethighscoreTabelle(); //Bsp. Datensatz muss noch entfernt werden.

		    String[] columnNames =  {"Name", "Punkte"};
		    highscore.setLayout(new BorderLayout(0, 0));
		    JTable table = new JTable(); //Leere Tabelle
		    DefaultTableModel tableModel = new DefaultTableModel(rowData, columnNames) { //Tabelle formatieren und Zellen nicht bearbeitbar machen
				private static final long serialVersionUID = 838285314713L;
		        public boolean isCellEditable(int row, int column) {
		           //all cells false
		           return false;
		        }
		    };
		    table.setAutoCreateRowSorter(true); //Tabelle Sortierbar durch Tabellenkopf
		    table.getTableHeader().setReorderingAllowed(false); //Tabelle nicht mehr drag and drop
		    table.setModel(tableModel);		    
		    highscore.add( new JScrollPane( table ) );
			
			
		}
		
		public void aktualisiereHand() {
			
			//Alle Elemente entfernen
			for(Component c : spielerkarten.getComponents()){
				spielerkarten.remove(c);
				spielerkarten.revalidate();
			}
			
			//Alle Karten auf der Hand darstellen
			for(int i = 0; i< aktuellesSpiel.getKartensatz().getHand(Spieler.SPIELER).size(); i++){
				labels[i] = new JLabel();
				labels[i].setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
				labels[i].setAlignmentY(Component.TOP_ALIGNMENT);
				labels[i].setBounds(new Rectangle(0, 0, 120, 180));
				labels[i].setSize(new Dimension(120, 180));
				labels[i].setHorizontalTextPosition(SwingConstants.CENTER);
				labels[i].setHorizontalAlignment(SwingConstants.CENTER);
				labels[i].setName(aktuellesSpiel.getKartensatz().getHand(Spieler.SPIELER).get(i).toString());
				labels[i].addMouseListener(new MouseAdapter() {
					@Override
					public void mouseClicked(MouseEvent e) {
						aktuellesSpiel.karteLegen(Integer.parseInt(e.getComponent().getName()));
						System.out.println("Karte: " + e.getComponent().getName() + " ausgewählt.");
						aktualisiereGUI();
					}
				}); 
				labels[i].setIcon(new ImageIcon(texturenpakete.getTextur(aktuellesSpiel.getKartensatz().getHand(Spieler.SPIELER).get(i)).getScaledInstance(150, 210, Image.SCALE_SMOOTH)));
				spielerkarten.add(labels[i]);
				spielerkarten.updateUI(); //Panel erneuern	
			}
		}
		
		
		public void aktualisiereAblage(){
			int sum = 0;
			  synchronized (this) {
			        int i = 0;
			        while (i < 100000) {
			            sum += i;
			            i++; 
			        }
			        notify(); 
			    } 
			ablagestapel.setIcon(new ImageIcon(texturenpakete.getTextur(aktuellesSpiel.getKartensatz().getletzteKarte()).getScaledInstance(150, 210, Image.SCALE_SMOOTH)));
			ablagestapel.revalidate();
			ablagestapel.repaint();
		}
		
		public void aktualisiereSpieleranzeige() {
			if(aktuellesSpiel.getamZug() == Spieler.COMPUTER) {
				label_aktuellerSpieler.setText("Gegner");			
				label_aktuellerSpieler.setForeground(Color.RED);
			}
			if(aktuellesSpiel.getamZug() == Spieler.SPIELER) {
				label_aktuellerSpieler.setText("Spieler");			
				label_aktuellerSpieler.setForeground(Color.GREEN);
			}
			
			if(aktuellesSpiel.getamZug() == null) {
				label_aktuellerSpieler.setText("Auswahlphase");			
				label_aktuellerSpieler.setForeground(Color.WHITE);
			}
		}
		
		
		public void showaussetzen() {
			aussetzen.setVisible(true);
			mitte_unten.updateUI();
			//System.out.println("DASHBOARD_GUI showaussetzen bis zum Ende aufgerufen!");
		}
		
		public void aktualisiereGUI(){
			aktualisiereSpieleranzeige();
			aktualisiereAblage();
			aktualisiereHand();
			revalidate();
			repaint();
		}
		
		public void showwunsch(boolean status){
			btnpik.setVisible(status);
			btnherz.setVisible(status);
			btnkaro.setVisible(status);
			btnkreuz.setVisible(status);
			mitte_unten.updateUI();
		}
		
		public Farbe getwunschfarbe() {			
			return Farbe.KARO;
		}
		
		
		public void gewonnen(Spieler spieler) {
			
			if(spieler == spieler.SPIELER) {
				System.out.println("Spiel gewonnen");
				label_final.setText("Spiel gewonnen");
			}
			if(spieler == spieler.COMPUTER) {
				System.out.println("Spieler verloren");
				label_final.setText("Spieler verloren");
			}
			player_hand.setVisible(false);
			label_final.setVisible(true);
			ablagestapel.setVisible(false);
			rechts.setVisible(false);
			updateUI();
			aktualisiereGUI();
		}
}


