package de.stoermer.xxx.client;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.Locale;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

import de.stoermer.xxx.domain.Session;
import de.stoermer.xxx.domain.Spieler;
import de.stoermer.xxx.domain.aufgaben.Lock;

public class DebugDialog extends JDialog {
	private static final long serialVersionUID = 1L;
	private Session session;

	public DebugDialog(MainFrame mainFrame, Session session) {
		this.session = session;
		setModal(true);
		this.setContentPane(getJContentPane());
		this.setPreferredSize(new Dimension(800,600));
		pack();
		this.setLocationRelativeTo(mainFrame);
		setVisible(true);
	}
	
	private JPanel getJContentPane() {
		JPanel panel = new JPanel(new BorderLayout());
		panel.add(getCenterPane(), BorderLayout.CENTER);
		panel.add(getButtonPanel(), BorderLayout.SOUTH);
		return panel;
	}
	
	private JScrollPane getCenterPane() {
		JPanel panel = new JPanel(new GridLayout((session.getSpieler().size() + 1), 1, 5, 5));
		
		JPanel sessionDetails = new JPanel(new GridLayout(6, 2, 5,5));
		sessionDetails.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY));
		
		JLabel level = new JLabel("Level: " + session.getLevel());
		JLabel aufgabenProLevel = new JLabel("Aufgaben pro Level: " + session.getAufgabenProLevel());
		JLabel aufgabenInLevel = new JLabel("Aufgaben in Level:" + session.getAufgabeAufAktuellenLevel());
		JLabel wahrscheinlichkeitSperre = new JLabel("Wahrscheinlichkeit Sperre: " + session.getWahrscheinlichkeitSperre());
		JLabel wahrscheinlichkeitStrafe = new JLabel("Wahrscheinlichkeit Strafe: " + session.getWahrscheinlichkeitStrafe());
		
		JLabel nummerAufgaben = new JLabel("Anzahl Aufgaben: " + session.getBeglueckungen().size());
		JLabel nummerSperren = new JLabel("Anzahl Sprerren: " + session.getSperren().size());
		JLabel nummerStrafen = new JLabel("Anzahl Strafen: " + session.getStrafen().size());
		
		sessionDetails.add(level);
		sessionDetails.add(wahrscheinlichkeitSperre);
		sessionDetails.add(aufgabenProLevel);
		sessionDetails.add(wahrscheinlichkeitStrafe);
		sessionDetails.add(aufgabenInLevel);
		sessionDetails.add(new JLabel());
		sessionDetails.add(nummerAufgaben);
		sessionDetails.add(new JLabel());
		sessionDetails.add(nummerSperren);
		sessionDetails.add(new JLabel());
		sessionDetails.add(nummerStrafen);		
		sessionDetails.add(new JLabel());
		
		panel.add(sessionDetails);
		
		for (Spieler spieler : session.getSpieler()) {
			JPanel spielerPanel = new JPanel(new GridLayout((3 + spieler.getCurrentLocks().entrySet().size()), 1,5,5));
			spielerPanel.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY));
			
			spielerPanel.add(new JLabel("Name: " + spieler.getName()));
			
			StringBuilder rollenBuilder = new StringBuilder();
			spieler.getRollen().forEach(rolle -> rollenBuilder.append(rolle.anzeigeText() + "; "));
			spielerPanel.add(new JLabel("Rollen: " + rollenBuilder.toString().trim()));
			
			StringBuilder werkzeugBuilder = new StringBuilder();
			spieler.getWerkzeuge().forEach(werkzeug -> werkzeugBuilder.append(werkzeug.anzeigeText() + "; "));
			spielerPanel.add(new JLabel("Tools: " + werkzeugBuilder.toString().trim()));
			
			for (Lock lock : spieler.getCurrentLocks().entrySet().stream().map(entry -> entry.getValue()).toList()) {
				spielerPanel.add(new JLabel("Lock " + lock.getWerkzeug() + " bis " + lock.getReleaseTime().format(
						DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT).withLocale(new Locale("de"))) + " (ursprünglich " + lock.getMinuten() + " Minuten)"));
			}
			
			panel.add(spielerPanel);
		}
		
		JScrollPane result = new JScrollPane(panel);
		return result;
	}
	
	private JPanel getButtonPanel() {
		JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
		
		JButton abbrechen = new JButton("Abbrechen");
		abbrechen.addActionListener((e) -> this.dispose());
		buttons.add(abbrechen);
		
		return buttons;
	}
}
