import os

def slicer(string):
    out = []
    string = string.strip()
    string = string.split(" ")
    for i in string:
        if i != "":
            out.append(i)
    return out

# Declaration of variables
filelist = []
n_atoms = 0

# Generation of output directory and path
os.mkdir("OUTPUT")
path = os.getcwd() + r"\OUTPUT"

# Request of descriptors of interest
mul = input("Do you want to collect Mulliken charges?(y/n): ")
hir = input("Do you want to collect Hirshfeld charges?(y/n): ")
cm5 = input("Do you want to collect CM5 charges?(y/n): ")
esp = input("Do you want to collect ESP charges?(y/n): ")
npa = input("Do you want to collect NPA charges?(y/n): ")
wbi = input("Do you want to collect WBIs?(y/n): ")
if mul == "y":
    mul = True
if hir == "y":
    hir = True
if cm5 == "y":
    cm5 = True
if esp == "y":
    esp = True
if npa == "y":
    npa = True
if wbi == "y":
    wbi = True

# Definition of output files contents
outp_mul = ["File Name;M;C(Me);H(Me, agostic);H(Me, occupied);H(Me,empty);C(olefin,prox);C(olefin,distal);H(prox,occ);H(prox,empty);H(dist,occ);H(dist,free);Total\n"]
outp_hir = ["File Name;M;C(Me);H(Me, agostic);H(Me, occupied);H(Me,empty);C(olefin,prox);C(olefin,distal);H(prox,occ);H(prox,empty);H(dist,occ);H(dist,free);Total\n"]
outp_cm5 = ["File Name;M;C(Me);H(Me, agostic);H(Me, occupied);H(Me,empty);C(olefin,prox);C(olefin,distal);H(prox,occ);H(prox,empty);H(dist,occ);H(dist,free);Total\n"]
outp_esp = ["File Name;M;C(Me);H(Me, agostic);H(Me, occupied);H(Me,empty);C(olefin,prox);C(olefin,distal);H(prox,occ);H(prox,empty);H(dist,occ);H(dist,free);Total\n"]
outp_npa = ["File Name;M;C(Me);H(Me, agostic);H(Me, occupied);H(Me,empty);C(olefin,prox);C(olefin,distal);H(prox,occ);H(prox,empty);H(dist,occ);H(dist,free);Total\n"]
outp_wbi = ["File Name;WBI(M-Me);WBI(M-dist);WBI(dist-prox);WBI(Me-prox)\n"]

# Generation of a list containing file names
for x in os.listdir():
    if x.endswith(".out"):
        filelist.append(x)

# Descriptors colletion
for x in filelist:
    outp_mul.append(x + ";")
    outp_hir.append(x + ";")
    outp_cm5.append(x + ";")
    outp_esp.append(x + ";")
    outp_npa.append(x + ";")
    outp_wbi.append(x + ";")
    inp = open(x, "r")
    inp_content = inp.readlines()
    for i in range(len(inp_content)):
        if "NAtoms=" in inp_content[i]:
            n_atoms = int(slicer(inp_content[i])[1])
        if mul == True and "Mulliken charges:" in inp_content[i]:
            for j in range(11):
                outp_mul.append(slicer(inp_content[i+2+j])[2] + ";")
            outp_mul.append(slicer(inp_content[i+2+n_atoms])[5] + "\n")
        if hir == True and "Hirshfeld charges, spin densities, dipoles, and CM5 charges" in inp_content[i]:
            for j in range(11):
                outp_hir.append(slicer(inp_content[i+2+j])[2] + ";")
            outp_hir.append(slicer(inp_content[i+2+n_atoms])[1] + "\n")
        if cm5 == True and "Hirshfeld charges, spin densities, dipoles, and CM5 charges" in inp_content[i]:
            for j in range(11):
                outp_cm5.append(slicer(inp_content[i+2+j])[7] + ";")
            outp_cm5.append(slicer(inp_content[i+2+n_atoms])[6] + "\n")
        if esp == True and "ESP charges:" in inp_content[i]:
            for j in range(11):
                outp_esp.append(slicer(inp_content[i+2+j])[2] + ";")
            outp_esp.append(slicer(inp_content[i+2+n_atoms])[5] + "\n")
        if npa == True and "Summary of Natural Population Analysis:" in inp_content[i]:
            for j in range(11):
                outp_npa.append(slicer(inp_content[i+6+j])[2] + ";")
            outp_npa.append(slicer(inp_content[i+7+n_atoms])[3] + "\n")
        if wbi == True and "Wiberg bond index matrix in the NAO basis:" in inp_content[i]:
            outp_wbi.append(slicer(inp_content[i+4])[3] + ";")
            outp_wbi.append(slicer(inp_content[i+4])[8] + ";")
            outp_wbi.append(slicer(inp_content[i+9])[8] + ";")
            outp_wbi.append(slicer(inp_content[i+9])[3] + "\n")
    inp.close()
    print("The file " + x + " has been analyzed")

# Generation of CSV files in the output directory
os.chdir(path)
if mul == True:
    outp = open("Mulliken_charges.txt", "w")
    outp.writelines(outp_mul)
    outp.close()
    os.rename("Mulliken_charges.txt", "Mulliken_charges.csv")
if hir == True:
    outp = open("Hirshfeld_charges.txt", "w")
    outp.writelines(outp_hir)
    outp.close()
    os.rename("Hirshfeld_charges.txt", "Hirshfeld_charges.csv")
if cm5 == True:
    outp = open("CM5_charges.txt", "w")
    outp.writelines(outp_cm5)
    outp.close()
    os.rename("CM5_charges.txt", "CM5_charges.csv")
if esp == True:
    outp = open("ESP_charges.txt", "w")
    outp.writelines(outp_esp)
    outp.close()
    os.rename("ESP_charges.txt", "ESP_charges.csv")
if npa == True:
    outp = open("NPA_charges.txt", "w")
    outp.writelines(outp_npa)
    outp.close()
    os.rename("NPA_charges.txt", "NPA_charges.csv")
if wbi == True:
    outp = open("WBIs.txt", "w")
    outp.writelines(outp_wbi)
    outp.close()
    os.rename("WBIs.txt", "WBIs.csv")