package net.dzikoysk.funnyguilds;

import com.google.common.base.Throwables;
import com.google.common.collect.Iterables;
import net.dzikoysk.funnyguilds.util.commons.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.kohsuke.github.GHCommit;
import org.kohsuke.github.GitHub;

import java.io.IOException;

public final class FunnyGuildsVersion {

    private static final String VERSION_FILE_URL = "https://funnyguilds.dzikoysk.net/latest.info";

    public static void isNewAvailable(CommandSender sender, boolean force) {
        if (!FunnyGuilds.getInstance().getPluginConfiguration().updateInfo && !force) {
            return;
        }

        if (!sender.hasPermission("funnyguilds.admin")) {
            return;
        }

        FunnyGuilds.getInstance().getServer().getScheduler().runTaskAsynchronously(FunnyGuilds.getInstance(), () -> {
            String latest = IOUtils.getContent(VERSION_FILE_URL);

            if (latest != null) {
                String currentNightlyHash = getCurrentNightlyHash(latest);

                if (StringUtils.isNotBlank(currentNightlyHash)) {
                    if (FunnyGuilds.getInstance().getPluginConfiguration().updateNightlyInfo) {
                        try {
                            GitHub github = FunnyGuilds.getInstance().getGithubAPI();

                            if (github == null) {
                                return;
                            }

                            GHCommit latestCommit = Iterables.get(
                                    github.getOrganization("FunnyGuilds").getRepository("FunnyGuilds").listCommits(), 0);

                            String commitHash = latestCommit.getSHA1().substring(0, 7);

                            if (! commitHash.equals(currentNightlyHash)) {
                                printNewVersionAvailable(sender, latest + "-" + commitHash, true);
                            }
                        }
                        catch (IOException ex) {
                            FunnyGuilds.getInstance().getPluginLogger().debug("Could not retrieve latest nightly version!");
                            FunnyGuilds.getInstance().getPluginLogger().debug(Throwables.getStackTraceAsString(ex));
                        }
                    }
                }
                else if (! latest.equalsIgnoreCase(FunnyGuilds.getInstance().getFullVersion())) {
                    printNewVersionAvailable(sender, latest, false);
                }
            }
        });
    }

    private static void printNewVersionAvailable(CommandSender sender, String latest, boolean isNightly) {
        sender.sendMessage("");
        sender.sendMessage(ChatColor.DARK_GRAY + "-----------------------------------");
        sender.sendMessage(ChatColor.GRAY + "Dostepna jest nowa wersja " + ChatColor.AQUA
                + "FunnyGuilds" + (isNightly ? " Nightly" : "") + ChatColor.GRAY + '!');
        sender.sendMessage(ChatColor.GRAY + "Obecna: " + ChatColor.AQUA + FunnyGuilds.getInstance().getFullVersion());
        sender.sendMessage(ChatColor.GRAY + "Najnowsza: " + ChatColor.AQUA + latest);
        sender.sendMessage(ChatColor.DARK_GRAY + "-----------------------------------");
        sender.sendMessage("");
    }

    private static String getCurrentNightlyHash(String latest) {
        String remainder = StringUtils.replace(FunnyGuilds.getInstance().getFullVersion(), latest, "").trim();

        // hyphen + short commit hash
        if (remainder.length() != 8 || ! remainder.startsWith("-")) {
            return "";
        }

        return StringUtils.replace(remainder, "-", "");
    }

    private FunnyGuildsVersion() {}

}