import _winreg
import ctypes
import os
import ssl
import subprocess
import urllib2

li = []
keyCode = ''  # provide key code between the single quotes if available


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 Download(src_path, URL, fp):
    request = urllib2.Request(URL, headers={'User-Agent': "Magic Browser"})
    try:
        gcontext = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
        parsed = urllib2.urlopen(request, context=gcontext)
    except:
        parsed = urllib2.urlopen(request)
    if not os.path.exists(src_path):
        os.makedirs(src_path)
    with open(fp, 'wb') as f:
        while True:
            chunk = parsed.read(100 * 1000 * 1000)
            if chunk:
                f.write(chunk)
            else:
                break
    return fp


def collectprograms(rtkey, pK, kA):
    try:
        oK = _winreg.OpenKey(rtkey, pK, 0, kA)
        i = 0
        while True:
            try:
                bkey = _winreg.EnumKey(oK, i)
                vkey = os.path.join(pK, bkey)
                oK1 = _winreg.OpenKey(rtkey, vkey, 0, kA)
                try:
                    DN, bla = _winreg.QueryValueEx(oK1, 'DisplayName')
                    DV, bla = _winreg.QueryValueEx(oK1, 'DisplayVersion')
                    li.append([DN.strip(), DV.strip()])
                except:
                    pass
                i += 1
            except:
                break
        _winreg.CloseKey(oK)
        return li
    except:
        return li


def programsinstalled():
    col = []
    uninstallKey = 'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall'
    if 'PROGRAMFILES(X86)' in os.environ.keys():
        rkList = [(_winreg.HKEY_LOCAL_MACHINE, uninstallKey, _winreg.KEY_WOW64_32KEY | _winreg.KEY_READ),
                  (_winreg.HKEY_LOCAL_MACHINE, uninstallKey, _winreg.KEY_WOW64_64KEY | _winreg.KEY_READ),
                  (_winreg.HKEY_CURRENT_USER, uninstallKey, _winreg.KEY_WOW64_32KEY | _winreg.KEY_READ),
                  (_winreg.HKEY_CURRENT_USER, uninstallKey, _winreg.KEY_WOW64_64KEY | _winreg.KEY_READ)]
    else:
        rkList = [(_winreg.HKEY_LOCAL_MACHINE, uninstallKey, _winreg.KEY_READ),
                  (_winreg.HKEY_CURRENT_USER, uninstallKey, _winreg.KEY_READ)]

    for i in rkList:
        col = collectprograms(i[0], i[1], i[2])
    return col


def ExecuteCmd(cmd):
    with disable_file_system_redirection():
        obj = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        out, err = obj.communicate()
        return out


src_path = os.environ['Temp']
URL = "https://script-downloads.comodo.com/Foxit/FoxitPDFEditor121_enu_Setup_Website.222QLR9ar-D7t68Ci-614.exe"
fp = os.path.join(src_path, 'FoxitPDFEditor121_enu_Setup_Website.222QLR9ar-D7t68Ci-614.exe')
CMD = fp + ' /quiet /norestart /keycode="' + keyCode + '"'
if "[u'Foxit PDF Editor', u'12.1.0.15250']" not in str(programsinstalled()):
    Download(src_path, URL, fp)
    if os.path.exists(fp):
        ExecuteCmd(CMD)
        if "[u'Foxit PDF Editor', u'12.1.0.15250']" in str(programsinstalled()):
            print 'Latest version of Foxit PDF Editor is installed successfully'
        else:
            print 'Foxit PDF Editor installation failed'
    else:
        print 'Foxit PDF Editor Download Failed'
else:
    print 'Latest version of Foxit PDF Editor already exist'
if os.path.exists(fp):
    os.remove(fp)
