#!/usr/bin/env python3

#by PabstMirror - python script to verify all addons using MakePbo's lint checking and extFile Checking
#Arguments (eg: `config_validator.py full`):
#full        dump full deRaped config of problem
#skipExt     skips checking external file references

import os
import sys
import subprocess
import timeit
import time

######## GLOBALS #########
MAINPREFIX = "Z"
PREFIX = "ACE"
##########################

def Fract_Sec(s):
    temp = float()
    temp = float(s) / (60*60*24)
    d = int(temp)
    temp = (temp - d) * 24
    h = int(temp)
    temp = (temp - h) * 60
    m = int(temp)
    temp = (temp - m) * 60
    sec = temp
    return d,h,m,sec

def CheckPBO(p,useMakePbo,checkExternalFiles,errors):
    try:
        if useMakePbo:
            makePboArgs = "-PGU"
            if not checkExternalFiles:
                makePboArgs = "-PU"
            subprocess.run([
                "makepbo",
                makePboArgs,
                "-@={}\\{}\\addons\\{}".format(MAINPREFIX,PREFIX.rstrip("_"),p),
                p,
                "{}_{}.pbo".format(PREFIX,p)
            ], stdin=None, input=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True)
        else:              
            makePboArgs = "-LEP"
            if not checkExternalFiles:
                makePboArgs = "-LP"
            subprocess.run([
                "rapify",
                makePboArgs,
                p
            ], stdin=None, input=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True)
            
    except subprocess.CalledProcessError as e:
        print("!! Problem With {} ret {} !!".format(p, e.returncode))
        print("     stderr: {}".format(e.stderr))
        errors.append(p)
    else:
        print("  Checked ok {}".format(p))
    return

def fullDump(p):
    try:
        subprocess.run([
            "makepbo",
            "-PGUS",  #G Check external references -S show deRap - P dont pause
            "-@={}\\{}\\addons\\{}".format(MAINPREFIX,PREFIX.rstrip("_"),p),
            p,
            "{}_{}.pbo".format(PREFIX,p)
        ], stdin=None, input=None, check=True)
    except subprocess.CalledProcessError as e:
        input("Press Enter to continue...")
    return

def main(argv):
    print("""
  ####################
  # ACE3 Config Check #
  ####################
""")

    start_time = timeit.default_timer()

    addonspath = os.path.join("P:\\",MAINPREFIX,PREFIX,"addons")

    print("Switching to dir: {}".format(addonspath))
    try:
        os.chdir(addonspath)
    except:
        raise Exception("Failed to switch to addon dir on P:")

    useMakePbo = False
    checkExternalFiles = True
    
    if "skipExt" in argv:
        print("Skipping External Files Check");
        checkExternalFiles = False
    if "make" in argv:
        # will check more files like RTM and RVMats but twice as slow
        # This also actually builds a pbo (in same spot as build.py)
        print("Using makePbo to verify all files");
        useMakePbo = True

    errors = []

    for p in os.listdir(addonspath):
        path = os.path.join(addonspath, p)
        if not os.path.isdir(path):
            continue
        if p[0] == ".":
            continue
        CheckPBO(p,useMakePbo,checkExternalFiles,errors)


    d,h,m,s = Fract_Sec(timeit.default_timer() - start_time)
    print("\n# Done with {0} errrors [took: {1:2}h {2:2}m {3:4.5f}s]".format(len(errors),h,m,s))

    if (len(errors) > 0):
        if "full" in argv:
            input("Dumping Full DeRap: Press Enter to continue...")
            for p in errors:
                fullDump(p)
        else:
            print("use 'full' arg to show derap")

    ret = len(errors)
    print("return {}".format(ret))
    return ret

if __name__ == "__main__":
    main(sys.argv)