package jnet.client.gui.dialog;

import java.awt.BorderLayout;
import java.awt.Font;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;

public class DialogLocalPing extends Thread {

    public DialogLocalPing(String ip) {

        // Spuštění vlákna pro ping
        new Thread(() -> runPing(ip)).start();
    }

    private static void runPing(String host) {
        int countOk = 0;
        int countKo = 0;
        ArrayList<Double> times = new ArrayList<>();

        Border margin = BorderFactory.createEmptyBorder(20, 20, 20, 20); // 10px nahoře a dole, 20px vlevo a vpravo

        JFrame frame = new JFrame("Ping " + host);

        // Vytvoření hlavního okna
        frame.setSize(450, 400);
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        // Hlavní panel
        JPanel mainPanel = new JPanel(new BorderLayout());

        // Textová oblast pro logy
        JTextArea logTextArea = new JTextArea();
        logTextArea.setEditable(false); // Zamezení úprav uživatelem
        logTextArea.setFont(new Font("Monospaced", Font.PLAIN, 12)); // Monospace font pro logy
        logTextArea.setBorder(margin);
        // Posuvník pro textovou oblast
        JScrollPane scrollPane = new JScrollPane(logTextArea);
        //scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

        // panel statistik
        JLabel stat = new JLabel("test");
        stat.setBorder(margin);

        mainPanel.add(scrollPane, BorderLayout.CENTER); // TextArea uprostřed
        mainPanel.add(stat, BorderLayout.SOUTH); // JLabel na spodek

        // Přidání hlavního panelu do okna
        frame.add(mainPanel);

        // Zobrazení okna
        frame.setVisible(true);

        try {
            // Použití správného příkazu pro OS
            String os = System.getProperty("os.name").toLowerCase();
            String command = os.contains("win") ? "ping -t " + host : "ping " + host;

            Process process = Runtime.getRuntime().exec(command);
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));

            String firstLine = reader.readLine();  // Tento řádek bude přeskočen
            String secondLine = reader.readLine();  // Tento řádek bude přeskočen

            Pattern pattern1 = Pattern.compile("time=([0-9.]+)ms");
            Pattern pattern2 = Pattern.compile("time[<]?([0-9.]+)ms");

            String line;
            while ((line = reader.readLine()) != null) {

                Matcher matcher1 = pattern1.matcher(line);
                Matcher matcher2 = pattern2.matcher(line);
                if (matcher1.find()) {
                    // čas 1ms a vice
                    double time = Double.valueOf(matcher1.group(1));
                    countOk++;
                    times.add(time);
                    appendText(logTextArea, "Odpověď od " + host + " za " + time + " ms");
                } else if (matcher2.find()) {
                    // cas mene nez 1 ms
                    double time = 0;
                    countOk++;
                    times.add(time);
                    appendText(logTextArea, "Odpověď od " + host + " za " + time + " ms");
                } else {
                    countKo++;
                    appendText(logTextArea, line);
                }
                // aktualizace statistik 
                stat.setText("Odesláno: " + (countOk + countKo) + "   "
                        + "úspěšně: " + countOk + "   "
                        + "neuspěšně: " + countKo + "   "
                        + "průmerny čas: " + calculateAverage(times) + " ms");
            }
        } catch (Exception e) {
            appendText(logTextArea, "Chyba při provádění pingu: " + e.getMessage());
        }
    }

    private static void appendText(JTextArea logTextArea, String text) {
        SwingUtilities.invokeLater(() -> {
            logTextArea.append(text + "\n");
            logTextArea.setCaretPosition(logTextArea.getDocument().getLength()); // Auto-scroll dolů
        });
    }

    public static double calculateAverage(ArrayList<Double> list) {
        double sum = 0;
        // Sečítání všech hodnot v ArrayListu
        for (double value : list) {
            sum += value;
        }
        // Vypočítání průměru
        return Math.round(sum / list.size());
    }

}
