import os, sys
import json
import zipfile

def getMinecraftPath():
    if   sys.platform.startswith('linux'):
        return os.path.expanduser("~/.minecraft")
    elif sys.platform.startswith('win'):
        return os.path.join(os.getenv("APPDATA"), ".minecraft")
    elif sys.platform.startswith('darwin'):
        return os.path.expanduser("~/Library/Application Support/minecraft")
    else:
        print "Cannot detect of version : %s. Please report to your closest sysadmin"%sys.platform
        sys.exit()

def getNativesKeyword():
    if   sys.platform.startswith('linux'):
        return "linux"
    elif sys.platform.startswith('win'):
        return "windows"
    elif sys.platform.startswith('darwin'):
        return "osx"
    else:
        print "Cannot detect of version : %s. Please report to your closest sysadmin"%sys.platform
        sys.exit()        

def checkMCDir(src, version):
    #We check that our version of MC is available for analysis
    if not os.path.exists(src) \
      or not os.path.exists(os.path.join(src, "versions")) \
      or not os.path.exists(os.path.join(src, "libraries")) \
      or not os.path.exists(os.path.join(os.path.join(src, "versions"), version)):
        print ("ERROR : You should run the launcher at least once before starting MCP")
        sys.exit()

def getJSONFilename(src, version):
    return os.path.join(os.path.join(src, "versions"), version, "%s.json"%version)

def checkCacheIntegrity(root, jsonfile, osKeyword, version):
    libraries = getLibraries(root, jsonfile, osKeyword)

    if libraries == None:
        return False

    for library in libraries.values():
        if not checkLibraryExists(root, library):
            return False

    if not checkMinecraftExists(root, version):
        return False

    natives = getNatives(root, libraries)

    for native in natives.keys():
        if not checkNativeExists(root, native, version):
            return False

    return True

def checkLibraryExists(dst, library):
    if os.path.exists(os.path.join(dst, library['filename'])):
        return True
    else:
        return False

def checkMinecraftExists(root, version):
    if os.path.exists(os.path.join(root, "versions", version, '%s.jar'%version)) and \
       os.path.exists(os.path.join(root, "versions", version, '%s.json'%version)):
        return True
    else:
        return False

def checkNativeExists(root, native, version):
    nativePath = getNativePath(root, version)
    if (os.path.exists(os.path.join(nativePath, native))):
        return True
    else:
        return False

def getNatives(root, libraries):
    nativeList = {}
    for library in libraries.values():
        if library['extract']:

            srcPath = os.path.join(root, library['filename'])
            jarFile = zipfile.ZipFile(srcPath)
            fileList = jarFile.namelist()

            for _file in fileList:
                exclude = False;
                for entry in library['exclude']:
                    if entry in _file:
                        exclude = True
                if not exclude:
                    nativeList[_file] = library['filename']
    return nativeList

def getNativePath(root, version):
    return os.path.join(root, "versions", version, "%s-natives"%version)

def getLibraries(root, jsonfile, osKeyword):
    #We check the json exits
    if not os.path.exists(jsonfile):
        return None
        #print ("ERROR : json file %s not found."%jsonfile)
        #print ("You should run the launcher at least once before starting MCP")
        #sys.exit()
    
    #We parse the json file
    jsonFile = None    
    try:
        jsonFile = json.load(open(jsonfile))
    except Exception as e:
        print "Error while parsing the library JSON file : %s"%e
        sys.exit()
    
    mcLibraries  = jsonFile['libraries']
    outLibraries = {}
    
    for library in mcLibraries:
        libCononical = library['name'].split(':')[0]
        libSubdir    = library['name'].split(':')[1]
        libVersion   = library['name'].split(':')[2]
        libPath      = libCononical.replace('.', '/')
        extract      = False
        exclude     = []
    
        if 'natives' in library:
            libFilename = "%s-%s-%s.jar"%(libSubdir, libVersion, library['natives'][osKeyword])
        else:
            libFilename = "%s-%s.jar"%(libSubdir, libVersion)

        if 'extract' in library:
            extract = True
            if 'exclude' in library['extract']:
                exclude.extend(library['extract']['exclude'])
    
        libFullPath  = os.path.join(os.path.join(root, "libraries"), libPath, libSubdir, libVersion, libFilename)
        libRelativePath = os.path.join("libraries", libPath, libSubdir, libVersion, libFilename)
    
        #if not os.path.exists(libFullPath):
        #    print ("Error while trying to access libraries. Couldn't find %s"%libFullPath)
        #    sys.exit()

        outLibraries[libSubdir] = {'name':library['name'], 'filename':libRelativePath, 'extract':extract, 'exclude':exclude}

    return outLibraries


if __name__ == '__main__':
    osKeyword = getNativesKeyword()
    mcDir     = getMinecraftPath()
    mcLibraries = getLibraries(mcDir, getJSONFilename(mcDir, "1.6.1"), osKeyword)
    mcNatives = getNatives(mcDir, mcLibraries)

    for native in mcNatives.keys():
        if checkNativeExists("./jars", native, "1.6.1"):
            print 'Found %s %s'%(native, mcNatives[native])
        else:
            print 'Not found %s %s'%(native, mcNatives[native])