package com.dynious.versionchecker.handler;

import com.dynious.versionchecker.api.Update;
import com.dynious.versionchecker.checker.UpdateChecker;
import com.dynious.versionchecker.helper.ModHelper;
import com.dynious.versionchecker.helper.WebHelper;
import com.dynious.versionchecker.lib.IMCOperations;
import com.dynious.versionchecker.lib.Strings;

import net.minecraftforge.fml.common.event.FMLInterModComms;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.text.translation.I18n;

import java.util.List;

public class IMCHandler
{
    public static void processMessages(List<FMLInterModComms.IMCMessage> messageList)
    {
        for (FMLInterModComms.IMCMessage message : messageList)
        {
            if (message.key.equalsIgnoreCase(IMCOperations.ADD_UPDATE))
            {
                LogHandler.info("Received update from mod " + message.getSender());
                if (message.isNBTMessage())
                {
                    processAddUpdateMessage(message.getNBTValue(), message.getSender());
                }
                else if (message.isStringMessage())
                {
                    processAddUpdateMessage(message.getStringValue(), message.getSender());
                }
            }
            else if (message.key.equalsIgnoreCase(IMCOperations.ADD_VERSION_CHECK))
            {
                LogHandler.info("Received version check from mod " + message.getSender());
                if (message.isStringMessage())
                {
                    processVersionCheckMessage(message.getSender(), message.getStringValue());
                }
            }
            else if (message.key.equalsIgnoreCase(IMCOperations.ADD_CURSE_CHECK))
            {
                LogHandler.info("Received curse check from mod " + message.getSender());
                if (message.isNBTMessage())
                {
                    processCurseCheckMessage(message.getSender(), message.getNBTValue());
                }
            }
        }
    }

    public static void processAddUpdateMessage(NBTTagCompound tag, String sender)
    {
        Update update = new Update(sender);

        if (tag.hasKey(IMCOperations.MOD_DISPLAY_NAME))
        {
            update.displayName = tag.getString(IMCOperations.MOD_DISPLAY_NAME);
        }
        else
        {
            update.displayName = ModHelper.getModContainer(sender).getName();
        }

        if (tag.hasKey(IMCOperations.OLD_VERSION))
        {
            update.oldVersion = tag.getString(IMCOperations.OLD_VERSION);
        }
        else
        {
            update.oldVersion = ModHelper.getModContainer(sender).getVersion();
        }

        if (tag.hasKey(IMCOperations.NEW_VERSION))
        {
            update.newVersion = tag.getString(IMCOperations.NEW_VERSION);
        }

        if (tag.hasKey(IMCOperations.UPDATE_URL))
        {
            update.updateURL = tag.getString(IMCOperations.UPDATE_URL);
        }

        if (tag.hasKey(IMCOperations.IS_DIRECT_LINK))
        {
            update.isDirectLink = tag.getBoolean(IMCOperations.IS_DIRECT_LINK);
        }

        if (tag.hasKey(IMCOperations.CHANGE_LOG))
        {
            update.changeLog = tag.getString(IMCOperations.CHANGE_LOG);
        }

        if (tag.hasKey(IMCOperations.NEW_FILE_NAME))
        {
            update.newFileName = tag.getString(IMCOperations.NEW_FILE_NAME);
        }

        UpdateHandler.addUpdate(update);
    }

    public static void processAddUpdateMessage(String string, String sender)
    {
        Update update = Update.createFromJson(string);
        if (update != null)
        {
            if (update.displayName == null)
            {
                update.displayName = ModHelper.getModContainer(sender).getName();
            }
            if (update.oldVersion == null)
            {
                update.oldVersion = ModHelper.getModContainer(sender).getVersion();
            }
            UpdateHandler.addUpdate(update);
        }
    }

    public static void processVersionCheckMessage(String sender, String url)
    {
        UpdateChecker.addModToCheck(sender, url);
    }

    public static void processCurseCheckMessage(String sender, NBTTagCompound tag)
    {
        if (tag.hasKey(IMCOperations.CURSE_PROJECT_NAME) && tag.hasKey(IMCOperations.CURSE_FILENAME_PARSER))
        {
            String curseProjectName = tag.getString(IMCOperations.CURSE_PROJECT_NAME);
            String latestFilename = WebHelper.getLatestFilenameFromCurse("http://minecraft.curseforge.com/projects/" + curseProjectName + "/files/latest");
            if (latestFilename != null)
            {
                String fileNameParser = tag.getString(IMCOperations.CURSE_FILENAME_PARSER);
                int i = fileNameParser.indexOf('[');
                int o = fileNameParser.indexOf(']');
                if (i != -1 && o != -1)
                {
                    String version = latestFilename.replace(fileNameParser.substring(0, i), "").replace(fileNameParser.substring(o + 1, fileNameParser.length()), "");

                    if (version.equals(tag.hasKey(IMCOperations.OLD_VERSION) ? tag.getString(IMCOperations.OLD_VERSION) : ModHelper.getModContainer(sender).getVersion()))
                        return;

                    Update update = new Update(sender);

                    update.newVersion = version;
                    update.updateURL = "http://minecraft.curseforge.com/projects/" + curseProjectName + "/files/latest";
                    update.isDirectLink = true;
                    update.newFileName = latestFilename;
                    update.changeLog = I18n.translateToLocal(Strings.CURSE_UPDATE);

                    if (tag.hasKey(IMCOperations.MOD_DISPLAY_NAME))
                    {
                        update.displayName = tag.getString(IMCOperations.MOD_DISPLAY_NAME);
                    }
                    else
                    {
                        update.displayName = ModHelper.getModContainer(sender).getName();
                    }

                    if (tag.hasKey(IMCOperations.OLD_VERSION))
                    {
                        update.oldVersion = tag.getString(IMCOperations.OLD_VERSION);
                    }
                    else
                    {
                        update.oldVersion = ModHelper.getModContainer(sender).getVersion();
                    }

                    update.updateType = Update.UpdateType.CURSE;

                    UpdateHandler.addUpdate(update);
                    return;
                }
            }
        }
        LogHandler.error(String.format("An error was encountered when fetching latest version from Curse for %s!", sender));
    }
}