package jnet.client.gui;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import jnet.client.Client;
import jnet.lib.LogFile;
import jnet.lib.Status;
import jnet.lib.object.Map;

public class Tray {

    private SystemTray tray;
    private static TrayIcon trayIcon;
    private static PopupMenu menu = new PopupMenu();

    public void createAndShowTray() {
        try {
            // Ověření, zda je SystemTray podporován
            if (!SystemTray.isSupported()) {
                LogFile.printErr("SystemTray is not supported");
                return;
            }

            // Menu pro tray ikonu
            MenuItem exitItem = new MenuItem("Ukončit");
            exitItem.addActionListener(e -> {
                LogFile.printInfo("Exit application from tray icon");
                System.exit(0);
            });
            menu.add(exitItem);

            // Načtení výchozí ikony ze zdrojů
            trayIcon = new TrayIcon(loadImage("/img/flag_gray.png"), Client.APP_NAME, menu);
            trayIcon.setImageAutoSize(true);
            trayIcon.addActionListener(e -> {
                // Dvojklik - obnovit/minimalizovat okno
                Client.okno.setVisible(!Client.okno.isVisible());
            });

            tray = SystemTray.getSystemTray();
            tray.add(trayIcon);

        } catch (IOException | AWTException ex) {
            LogFile.printErr("TrayIcon error: " + ex.getMessage());
        }
    }

    private static BufferedImage loadImage(String path) throws IOException {
        try (var input = Tray.class.getResourceAsStream(path)) {
            if (input == null) {
                throw new IOException("Soubor nenalezen: " + path);
            }
            return ImageIO.read(input);
        }
    }

    public static void setIcon(String icon) {
        try {
            trayIcon.setImage(loadImage("/img/" + icon));
        } catch (IOException ex) {
            LogFile.printErr("TrayIcon error: " + ex.getMessage());
        }
    }

    public static void setStatusOffline() {
        setIcon("flag_red.png");
    }

    public static void setStatusOnline() {
        setIcon("flag_green.png");
    }

    public static void setStatusWarning() {
        setIcon("flag_orange.png");
    }

    public static void setStatusDisconnected() {
        setIcon("flag_gray.png");
    }

    public static void refresh() {
        setStatusOnline(); // Výchozí stav

        for (Map map : Client.maps) {
            int status = map.getStatus();
            if (status == Status.OFFLINE) {
                setStatusOffline();
                return;
            }
            if (status == Status.WARNING) {
                setStatusWarning();
            }
        }
    }
}
