package com.ygames.ysoccer.screens;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Texture;
import com.ygames.ysoccer.framework.Font;
import com.ygames.ysoccer.framework.GLGame;
import com.ygames.ysoccer.framework.GLScreen;
import com.ygames.ysoccer.framework.Settings;
import com.ygames.ysoccer.gui.Button;
import com.ygames.ysoccer.gui.Label;
import com.ygames.ysoccer.gui.MenuTheme;
import com.ygames.ysoccer.gui.Widget;

import java.io.IOException;

import static com.ygames.ysoccer.framework.Assets.font10;
import static com.ygames.ysoccer.framework.Assets.font14;
import static com.ygames.ysoccer.framework.Font.Align.CENTER;

class OnlineMenu extends GLScreen {

    private Label statusLabel;
    private boolean startingServer;

    OnlineMenu(GLGame game) {
        super(game);
        background = new Texture("images/backgrounds/menu_network.jpg");

        Widget w;

        w = new TitleBar("ONLINE", 0x1A5581);
        widgets.add(w);

        statusLabel = new StatusLabel();
        widgets.add(statusLabel);

        w = new StartServerButton();
        widgets.add(w);
        setSelectedWidget(w);

        w = new JoinJdcButton();
        widgets.add(w);

        w = new CustomConnectButton();
        widgets.add(w);

        w = new BackButton();
        widgets.add(w);
    }

    private void connectTo(String serverAddress) {
        Settings.serverAddress = serverAddress;
        game.settings.save();
        game.setScreen(new OnlineMatchConnect(game, true));
    }

    private class StatusLabel extends Label {
        StatusLabel() {
            setGeometry((game.gui.WIDTH - 720) / 2, 215, 720, 30);
            setText("", CENTER, font10);
        }
    }

    private class StartServerButton extends Button {
        StartServerButton() {
            setColors(MenuTheme.ACTION);
            setGeometry((game.gui.WIDTH - 360) / 2, 285, 360, 36);
            setText("START ONLINE SERVER", CENTER, font14);
        }

        @Override
        public void onFire1Down() {
            if (startingServer) {
                return;
            }

            startingServer = true;
            statusLabel.setText("STARTING SERVER... TCP " + Settings.tcpPort + " UDP " + Settings.udpPort);

            Thread thread = new Thread(() -> {
                try {
                    OnlineServerProcess.start();
                    Thread.sleep(1500);
                    Gdx.app.postRunnable(() -> connectTo("127.0.0.1"));
                } catch (IOException e) {
                    Gdx.app.postRunnable(() -> {
                        startingServer = false;
                        statusLabel.setText(e.getMessage().toUpperCase());
                    });
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    Gdx.app.postRunnable(() -> {
                        startingServer = false;
                        statusLabel.setText("SERVER START INTERRUPTED");
                    });
                }
            }, "ysp-online-server-start");
            thread.setDaemon(true);
            thread.start();
        }
    }

    private class JoinJdcButton extends Button {
        JoinJdcButton() {
            setColors(MenuTheme.ACTION);
            setGeometry((game.gui.WIDTH - 360) / 2, 335, 360, 36);
            setText("JOIN JDC", CENTER, font14);
        }

        @Override
        public void onFire1Down() {
            connectTo("jdc.se");
        }
    }

    private class CustomConnectButton extends Button {
        CustomConnectButton() {
            setColors(MenuTheme.VALUE);
            setGeometry((game.gui.WIDTH - 360) / 2, 385, 360, 36);
            setText("CUSTOM CONNECT", CENTER, font14);
        }

        @Override
        public void onFire1Down() {
            game.setScreen(new OnlineMatchConnect(game));
        }
    }

    private class BackButton extends Button {
        BackButton() {
            setColor(0xC84200);
            setGeometry((game.gui.WIDTH - 360) / 2, 460, 360, 36);
            setText("BACK", Font.Align.CENTER, font14);
        }

        @Override
        public void onFire1Down() {
            game.setScreen(new Main(game));
        }
    }
}
