package com.xeovalyte.polarcraft;

import com.xeovalyte.polarcraft.util.messageFunctions;
import com.xeovalyte.polarcraft.util.verifyFunction;

import net.fabricmc.api.ModInitializer;
import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.server.network.ServerPlayerEntity;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.io.File;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import net.fabricmc.fabric.api.message.v1.ServerMessageEvents;

public class PolarcraftMod implements ModInitializer {
    // This logger is used to write text to the console and the log file.
    // It is considered best practice to use your mod id as the logger's name.
    // That way, it's clear which mod wrote info, warnings, and errors.
    public static final Logger LOGGER = LoggerFactory.getLogger("polarcraft-mod");

    private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create();
    private static final File CONFIG_FILE = new File(FabricLoader.getInstance().getConfigDir().toFile(), "polarcraft.json");

    public static String configChatMessageUrl = "https://example.com/api/minecraft/message/chattodiscord";
    public static String configGameMessageUrl = "https://example.com/api/minecraft/message/gametodiscord";
    public static String configVerifyUrl = "https://example.com/api/minecraft/verifyuuid";

    @Override
    public void onInitialize() {
        // This code runs as soon as Minecraft is in a mod-load-ready state.
        // However, some things (like resources) may still be uninitialized.
        // Proceed with mild caution.
        loadConfig();

        ServerPlayConnectionEvents.JOIN.register((handler, sender, server) -> {
            ServerPlayerEntity player = (ServerPlayerEntity) handler.player;
            
            verifyFunction.onPlayerJoin(player, server);
        });

        ServerPlayConnectionEvents.DISCONNECT.register((handler, server) -> {
            ServerPlayerEntity player = (ServerPlayerEntity) handler.player;
            messageFunctions.sendGameMessage(player.getUuid(), player.getDisplayName().getString() + " left the game");
        });

        ServerMessageEvents.CHAT_MESSAGE.register((message, sender, params) -> {       
            messageFunctions.sendChatMessage(message, sender);
        });
    }

    private void loadConfig() {
        if (!CONFIG_FILE.exists()) {
            saveConfig();
            return;
        }
        
        try {
            MyModConfig config = GSON.fromJson(FileUtils.readFileToString(CONFIG_FILE, StandardCharsets.UTF_8), MyModConfig.class);
            configChatMessageUrl = config.chatMessageUrl;
            configGameMessageUrl = config.gameMessageUrl;
            configVerifyUrl = config.verifyUrl;
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    private void saveConfig() {
        try {
            FileUtils.writeStringToFile(CONFIG_FILE, GSON.toJson(new MyModConfig(configChatMessageUrl, configGameMessageUrl,configVerifyUrl)), StandardCharsets.UTF_8);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public static class MyModConfig {
        public String chatMessageUrl;
        public String gameMessageUrl;
        public String verifyUrl;
        
        public MyModConfig(String chatMessageUrl, String gameMessageUrl,String verifyUrl) {
            this.chatMessageUrl = chatMessageUrl;
            this.gameMessageUrl = gameMessageUrl;
            this.verifyUrl = verifyUrl;
        }
    }
}