import os
import sys
from urllib.error import HTTPError
from pathlib import Path

from handlers.handle_sftp import createSFTPConnection, sftp_listFilesInServerRoot
from handlers.handle_ftp import createFTPConnection, ftp_listFilesInServerRoot
from handlers.handle_config import configurationValues
from utils.consoleoutput import oColors
from serverjar.serverjar_paper import paperCheckForUpdate, papermc_downloader


def checkInstalledServerjar():
    configValues = configurationValues()
    if not configValues.localPluginFolder:
        if not configValues.sftp_useSftp:
            ftp = createFTPConnection()
            serverRootList = ftp_listFilesInServerRoot(ftp)
        else:
            sftp = createSFTPConnection()
            serverRootList = sftp_listFilesInServerRoot(sftp)
    else:
        serverRootList = os.path.dirname(configValues.pathToPluginFolder)
        serverRootList = os.listdir(serverRootList)
    installedServerjarFullName = None
    try:
        for files in serverRootList:
            try:
                if '.jar' in files:
                    installedServerjarFullName = files
                    break
            except TypeError:
                continue
    except TypeError:
        print(oColors.brightRed + "Serverjar couldn't be found." + oColors.standardWhite)
        print(oColors.brightRed + "Aborting the process." + oColors.standardWhite)

    if installedServerjarFullName == None:
        print(oColors.brightRed + "Serverjar couldn't be found." + oColors.standardWhite)
        print(oColors.brightRed + "Aborting the process." + oColors.standardWhite)
        input("Press any key + enter to exit...")
        sys.exit()
    print(oColors.brightBlack + f"Checking: {installedServerjarFullName}" + oColors.standardWhite)
    if 'paper' in installedServerjarFullName:
        paperCheckForUpdate(installedServerjarFullName)

    else:
        print(oColors.brightRed + f"{installedServerjarFullName} isn't supported.")
        print(oColors.brightRed + "Aborting the process." + oColors.standardWhite)


def updateServerjar(serverJarBuild='latest'):
    configValues = configurationValues()
    try:
        if serverJarBuild == None:
            serverJarBuild = 'latest'
        if not configValues.localPluginFolder:
            sftp = createSFTPConnection()
            serverRootPath = configValues.sftp_folderPath
            serverRootPath = Path(str(serverRootPath).replace(r'/plugins', ''))
            serverRootList = sftp_listFilesInServerRoot(sftp)

        else:
            serverRoot = os.path.dirname(configValues.pathToPluginFolder)
            serverRootList = os.listdir(serverRoot)
            serverRootPath = configValues.pathToPluginFolder
            helpPath = Path('/plugins')
            helpPathstr = str(helpPath)
            serverRootPath = Path(str(serverRootPath).replace(helpPathstr, ''))
            installedServerjarFullName = None

    except FileNotFoundError:
        print(oColors.brightRed + "Path couldn't be found!" + oColors.standardWhite)
        print(oColors.brightRed + "Check your config!" + oColors.standardWhite)
        print(oColors.brightRed + "Aborting the process." + oColors.standardWhite)
        input("Press any key + enter to exit...")
        sys.exit()

    try:
        for files in serverRootList:
            try:
                if '.jar' in files:
                    installedServerjarFullName = files
                    break
            except TypeError:
                continue
    except TypeError:
        print(oColors.brightRed + "Serverjar couldn't be found." + oColors.standardWhite)
        print(oColors.brightRed + "Aborting the process." + oColors.standardWhite)

    if installedServerjarFullName == None:
        print(oColors.brightRed + "Serverjar couldn't be found." + oColors.standardWhite)
        print(oColors.brightRed + "Aborting the process." + oColors.standardWhite)
        input("Press any key + enter to exit...")
        sys.exit()

    serverJarPath = Path(f"{serverRootPath}/{installedServerjarFullName}")

    if 'paper' in installedServerjarFullName:
        print(oColors.brightBlack + f"Updating Paper to build: {serverJarBuild}" + oColors.standardWhite)
        try:
            papermc_downloader(serverJarBuild, None, installedServerjarFullName)
            if not configValues.localPluginFolder:
                sftp.remove(serverJarPath)
            else:
                os.remove(serverJarPath)
        except HTTPError as err:
            print(oColors.brightRed +  f"Error: {err.code} - {err.reason}" + oColors.standardWhite)
        except FileNotFoundError:
            print(oColors.brightRed +  "Error: Old serverjar file coulnd't be deleted" + oColors.standardWhite)
    else:
        print(oColors.brightRed + f"{installedServerjarFullName} isn't supported.")
        print(oColors.brightRed + "Aborting the process." + oColors.standardWhite)