#! python3

#
import sys
import os
import mhrc.automation

# Import other utilities to perform cool stuff
from win32com.client.gencache import EnsureDispatch as Dispatch
from mhrc.automation.utilities.word import Word
from mhrc.automation.utilities.file import File

import win32com.client
import shutil

# Configuration

print("Automation Library:", mhrc.automation.VERSION)

pscad_version = 'PSCAD 4.6.3 (x64)'
fortran_version = 'GFortran 4.6.2'
fortran_ext = '.gf46'
project_name = 'aug2021_lean'

# Working directory
working_dir = os.getcwd() + "\\"

# Main script

# Source and destination folders for output data
src_folder = working_dir + project_name + fortran_ext
dst_folder = working_dir + "Outputs"

# Clear the output folder
try:
    shutil.rmtree(dst_folder)
except Exception as ignored:
    pass

os.mkdir(dst_folder)

# Launch specific PSCAD and Fortran version
pscad = mhrc.automation.launch_pscad(minimize=True, pscad_version=pscad_version, fortran_version=fortran_version)

if pscad:
    try:
        # Check if Licensing Certificate exists, on this computer
        pro = os.path.isfile(r"C:\Users\Public\Documents\Manitoba HVDC Research Centre\Licensing\Licenses\74.xml")
        edu = os.path.isfile(r"C:\Users\Public\Documents\Manitoba HVDC Research Centre\Licensing\Licenses\72.xml")

        # Existing certificate exists!, set PSCAD to use Certificate License
        if pro or edu:
            pscad.settings(cl_use_advanced='true')

        # No Certificate exists, set PSCAD to use dongle License
        else:
            pscad.settings(cl_use_advanced='false')

        # Load the project
        pscad.load([working_dir + project_name + ".pscx"])
        project = pscad.project(project_name)
        project.focus()

        # Get the "Main" canvas
        main = project.user_canvas('Main')

        # Get handle of the parameters to change

        # fault time
        time1 = main.user_cmp(105676566)  # before capacitor
        time2 = main.user_cmp(955826785)  # after capacitor

        # fault type
        fault_type1 = main.user_cmp(90539054)  # before capacitor
        fault_type2 = main.user_cmp(376391188)  # after capacitor

        # fault resistance
        fault_resistance1 = main.user_cmp(1935392458)  # before capacitor
        fault_resistance2 = main.user_cmp(744556284)  # after capacitor

        # line length/ fault position
        t1_1 = main.tline(279269849)  # before capacitor segment 1
        t1_2 = main.tline(302755989)  # before capacitor segment 2

        t2_1 = main.tline(1233690447)  # after capacitor segment 1
        t2_2 = main.tline(775240745)  # after capacitor segment 2

        # capacitors
        Ca = main.user_cmp(1000397811)
        Cb = main.user_cmp(947390020)
        Cc = main.user_cmp(191206985)

        # Change fault time, TF= time of fault, DF= duration of fault
        # fault time, to control the inception angles
        fault_t = 0.50384  # 0.49890 - zero , 0.50384 - 90
        fault_d = 1.5

        # Test 1, compensated line, forward fault before capacitor

        time1.set_parameters(TF=fault_t, DF=fault_d)  # setting fault times
        print("Forward fault at ", fault_t, "for ", fault_d, " seconds")

        fault_type2.set_parameters(Value=0) # setting fault type of part 1 to 0

        for j in [10, 30, 50, 70, 90, 95]:

            print("Fault distance ", j)

            #Solution_step = 10e-4  # solution steps in PSCAD
            #light = 3e8  # speed of light
            total = 100  # total line length before capacitor
            L1 = j  # fault from bus 1
            L2 = total - L1  # rest of the line

            t1_1.set_parameters(Length=L1)
            t1_2.set_parameters(Length=L2)
            t2_1.set_parameters(Length=50)
            t2_2.set_parameters(Length=50)

            #if L1 < (Solution_step * 3e8 / 1000):
                #print("Solution step too low or fault distance too close ! Invalid simulation")

            for i in range(0, 12):  # all fault types
                print("Fault type ", i)
                fault_type1.set_parameters(Value=i)

                for k in [67, 80, 94]:  # 50, 60 and 70%
                    Ca.set_parameters(C=k)
                    Cb.set_parameters(C=k)
                    Cc.set_parameters(C=k)

                    for x in [0.01, 10, 20]:  # fault resistances
                        fault_resistance1.set_parameters(RON=x)

                        # Run simulation        
                        project.run()
                        # Save data to output folder
                        folder = os.path.join(dst_folder, "Test_1")
                        # Convert PSCAD .out file to .csv
                        File.convert_out_to_csv(src_folder, "aug2021_lean_01.out",
                                                "test_f_" + str(j) + "_" + str(i) + "_" + str(k)
                                                + "_" + str(x) + ".csv")

        print("All simulations before capacitor completed!")

    finally:
        pscad.quit()
        pass
else:
    print("Failed to launch PSCAD")
