import ctypes
import os
import re
import subprocess

pluggedIntimeout = itsm.getParameter('PITO')  # provide pluggedin time out in minutes, data type must be string
OnBatterytimeout = itsm.getParameter('OBTO')  # provide onbattery time out in minutes, data type must be string

SetTimeout = r'''
powercfg -change -monitor-timeout-dc ''' + OnBatterytimeout + r'''
powercfg -change -monitor-timeout-ac ''' + pluggedIntimeout


class disable_file_system_redirection:
    _disable = ctypes.windll.kernel32.Wow64DisableWow64FsRedirection
    _revert = ctypes.windll.kernel32.Wow64RevertWow64FsRedirection

    def __enter__(self):
        self.old_value = ctypes.c_long()
        self.success = self._disable(ctypes.byref(self.old_value))

    def __exit__(self, type, value, traceback):
        if self.success:
            self._revert(self.old_value)


def getPowerScheme(SchemeList):
    for Power in SchemeList:
        if "(Ultimate Performance)" in Power:
            ultPwr = re.sub('(.+: )(.+)( +\(.+)', r'\2', Power)
            ExecuteCmd("powercfg /setactive " + ultPwr)
            if "(Ultimate Performance)" in ExecuteCmd("powercfg /GETACTIVESCHEME")[0]:
                return True
            break


def ExecuteCmd(cmd):
    with disable_file_system_redirection():
        obj = subprocess.Popen(["powershell", cmd], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        out, err = obj.communicate()
        return out, err


def CreateScriptFile(ps_content):
    try:
        file_name = 'ScriptFile.ps1'
        file_path = os.path.join(os.environ['TEMP'], file_name)
        with open(file_path, 'wb') as wr:
            wr.write(ps_content)
            wr.close()
        return file_path
    except:
        return None


def SetTimeOut():
    ScriptFile = CreateScriptFile(SetTimeout)
    if os.path.exists(ScriptFile):
        ExecuteCmd('powershell "%s"' % ScriptFile)
        os.remove(ScriptFile)


def powerPlans(powerPlan):
    PowerS = powerPlan.splitlines()
    if getPowerScheme(PowerS):
        print " ultimate performance Power plan has been set"
        ExecuteCmd('powershell "Set-ExecutionPolicy RemoteSigned"')
        SetTimeOut()
    else:
        print "script execution failed"


def SetUltimatePerf():
    powerPlan = ExecuteCmd("powercfg /List")[0]
    if "(Ultimate Performance)" in powerPlan:
        powerPlans(powerPlan)
    else:
        powerPlan = ExecuteCmd("powercfg -duplicatescheme e9a42b02-d5df-448d-aa00-03f14749eb61")[0]
        if "(Ultimate Performance)" in powerPlan:
            powerPlan = ExecuteCmd("powercfg /List")[0]
            powerPlans(powerPlan)


SetUltimatePerf()