#!/usr/bin/env python

#  This program is free software. It comes without any warranty, to
#  the extent permitted by applicable law. You can redistribute it
#  and/or modify it under the terms of the Do What The Fuck You Want
#  To Public License, Version 2, as published by Sam Hocevar. See
#  http://sam.zoy.org/wtfpl/COPYING for more details.
import sys, traceback
error = 0
try:
    import os, shutil
    from stat import *
    from string import Template

    _PLATFORM = sys.platform
    if _PLATFORM in ['win32','cygwin','darwin','os2','os2emx','riscos','atheos']:
        print "Whoa there buddy! This installation script isn't meant to be run on your OS."
        exit()

    if os.getuid() != 0:
        print "This program must be run as root (sudo)."
        exit()

    _HOME     = os.environ['HOME']
    _USER     = os.environ['SUDO_USER']
    _UID      = int(os.environ['SUDO_UID'])
    _GID      = int(os.environ['SUDO_GID'])
    # fix home if it's root weirdness
    if _HOME.find("root") != -1:
        _HOME = "/home/"+_USER

    def setPermissions(path):
        os.chown(path, _UID, _GID)
        for file_ in os.listdir(path):
            filePath = os.path.join(path,file_)
            if os.path.isdir(filePath):
                setPermissions(filePath)
            else:
                os.chown(filePath, _UID, _GID)

    def findPesterchum(path):
        for f in os.listdir(path):
            filePath = os.path.join(path, f)
            if os.path.isdir(filePath):
                if os.path.exists(filePath+"/pesterchum.py"):
                    return filePath
                else:
                    a=findPesterchum(filePath)
                    if a: return a
            elif f == "pesterchum.py":
                return path

    if not os.path.exists(_HOME+"/.pcInstallLoc"):
        print "Welcome to the Pesterchum 3.14 Easy Installer (for Linux)!\n\
        Created by Kiooeht [evacipatedBox] May 28th-29th, 2011.\n\
        License: WTFPL\n\
        \n\
    Leaving an option blank will accept it's default [in brackets]\n\
    Are you ready to begin your MAGICAL JOURNEY?!\n\
    Of course you are!!! ::::D"
        # ask user about things
        while 1:
            install = raw_input("Install location [~/.pesterchum]: ")
            if install == "":
                instLoc = _HOME+"/.pesterchum"
                break
            else:
                if install[0] == "~":
                    install = _HOME+install[1:]
                if os.path.exists(install[:install.rfind("/")]):
                    instLoc = install
                    break
            print "No can do"
        if os.path.exists("/usr/share/applications"):
            while 1:
                gnome = raw_input("Create a GNOME menu item? [Y/n]: ")
                if gnome.lower() == "y" or gnome == "":
                    gnome = True;break
                elif gnome.lower() == "n":
                    gnome = False;break
                else:
                    print "herpaderp"
            while 1:
                shortcut = raw_input("Create launcher in home directory? [Y/n]: ")
                if shortcut.lower() == "y" or shortcut == "":
                    shortcut = True;break
                elif shortcut.lower() == "n":
                    shortcut = False;break
                else:
                    print "u jelly?"

        # do some shitty install
        try:
            fileLoc = findPesterchum(".")
        except RuntimeError:
            print "I'm sorry! I was unable to find the pesterchum files :("
            print "Please put them where I can find them"
            exit()
        if not fileLoc:
            print "I'm sorry! I was unable to find the pesterchum files :("
            print "Please put them where I can find them"
            exit()
        print "Copying files..."
        ignore = shutil.ignore_patterns('*.pyc')
        if not os.path.exists(instLoc):
            shutil.copytree(fileLoc, instLoc, ignore=ignore)
            if os.path.exists(instLoc+"/pesterchum.js"):
                f = open(instLoc+"/pesterchum.js")
                js = f.read()
                f.close()
                defa = js.find("\"defaultprofile\"")
                if defa != -1:
                    start = js.find("\"", js.find(":", defa+1))
                    end = js.find("\"", start+1)
                    party = js[start+1:end]
                    if not os.path.exists(instLoc+"/profiles") or \
                       party+".js" not in os.listdir(instLoc+"/profiles"):
                        print "Protecting you from stupidity..."
                        print "  (aka. Deleting reference to non-existant default profile)"
                        #os.remove(instLoc+"/pesterchum.js")
                        f = open(instLoc+"/pesterchum.js", "w")
                        f.write(js[:defa-1]+js[js.find(",", end)+1:])
                        f.close()
        else:
            if not os.path.exists(instLoc+"/logs") and os.path.exists(fileLoc+"/logs"):
                shutil.copytree(fileLoc+"/logs", instLoc+"/logs", ignore=ignore)
            if not os.path.exists(instLoc+"/profiles") and os.path.exists(fileLoc+"/profiles"):
                shutil.copytree(fileLoc+"/profiles", instLoc+"/profiles", ignore=ignore)
            if not os.path.exists(instLoc+"/pesterchum.js") and os.path.exists(fileLoc+"/pesterchum.js"):
                shutil.copy(fileLoc+"/pesterchum.js", instLoc)
            shutil.copytree(fileLoc+"/oyoyo", instLoc+"/oyoyo", ignore=ignore)
            shutil.copytree(fileLoc+"/smilies", instLoc+"/smilies", ignore=ignore)
            shutil.copytree(fileLoc+"/themes", instLoc+"/themes", ignore=ignore)
            for f in os.listdir(fileLoc):
                filePath = os.path.join(fileLoc, f)
                if not os.path.isdir(filePath) and f != "pesterchum.js":
                    shutil.copy(filePath, instLoc)
        setPermissions(instLoc)
        # save the install location
        f = open(_HOME+"/.pcInstallLoc", "w")
        f.write(instLoc)
        f.close()
        #create a cool executable
        print "Creating executable... (/usr/local/bin/pesterchum)"
        f = open("/usr/local/bin/pesterchum", 'w')
        f.write("#!/bin/sh\ncd "+instLoc+"\n./pesterchum $@")
        f.close()
        os.chmod("/usr/local/bin/pesterchum", S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)
        # Create a fancy menu item in gnome
        if gnome:
            print "Creating menu item..."
            t = Template("[Desktop Entry]\nEncoding=UTF-8\nVersion=3.14.2\nName=Pesterchum\nComment=IM client based on Homestuck Pesterchum\nCategories=Network;InstantMessaging;\nExec=/usr/local/bin/pesterchum\nIcon=$loc/pesterchum.ico\nTerminal=false\nType=Application")
            f = open("/usr/share/applications/pesterchum.desktop", "w")
            f.write(t.safe_substitute(loc=instLoc))
            f.close()
        # create shortcut launcher
        if shortcut:
            print "Creating launcher..."
            t = Template("#!/usr/bin/env xdg-open\n[Desktop Entry]\nEncoding=UTF-8\nVersion=3.14.2\nName=Pesterchum\nComment=IM client based on Homestuck Pesterchum\nCategories=Network;InstantMessaging;\nExec=pesterchum\nIcon=$loc/pesterchum.ico\nTerminal=false\nType=Application")
            f = open(_HOME+"/Pesterchum.desktop", "w")
            f.write(t.safe_substitute(loc=instLoc))
            f.close()
            os.chown(_HOME+"/Pesterchum.desktop", _UID, _GID)
            os.chmod(_HOME+"/Pesterchum.desktop", S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)
    else:
        print "Welcome to the Pesterchum 3.14 Easy Uninstaller (for Linux)!\n\
        Created by Kiooeht [evacipatedBox] May 28th-29th, 2011.\n\
        License: WTFPL\n"
        while 1:
            remove = raw_input("Would you like to uninstall Pesterchum? [y/n]: ")
            if remove.lower() == "y":
                while 1:
                    killdata = raw_input("Purge your settings, profiles, and logs? [y/N]: ")
                    if killdata.lower() == "n" or killdata == "":
                        killdata = False;break
                    elif killdata.lower() == "y":
                        killdata = True;break
                    else:
                        print "Hmmmmm...?"
                f = open(_HOME+"/.pcInstallLoc")
                instLoc = f.readline()
                f.close()
                os.remove(_HOME+"/.pcInstallLoc")
                if killdata:
                    print "Removing files..."
                    shutil.rmtree(instLoc)
                else:
                    print "Backing up settings, profiles, and logs..."
                    if os.path.exists(instLoc+"/logs"):
                        shutil.move(instLoc+"/logs", "_easyBackupLOGS")
                    if os.path.exists(instLoc+"/profiles"):
                        shutil.move(instLoc+"/profiles", "_easyBackupPROFILES")
                    if os.path.exists(instLoc+"/pesterchum.js"):
                        shutil.move(instLoc+"/pesterchum.js", "_easyBackupSETTINGS")
                    print "Removing files..."
                    shutil.rmtree(instLoc)
                    print "Restoring up settings, profiles, and logs..."
                    os.mkdir(instLoc)
                    if os.path.exists("_easyBackupLOGS"):
                        shutil.move("_easyBackupLOGS", instLoc+"/logs")
                    if os.path.exists("_easyBackupPROFILES"):
                        shutil.move("_easyBackupPROFILES", instLoc+"/profiles")
                    if os.path.exists("_easyBackupSETTINGS"):
                        shutil.move("_easyBackupSETTINGS", instLoc+"/pesterchum.js")
                    setPermissions(instLoc)
                print "Trashing executable..."
                os.remove("/usr/local/bin/pesterchum")
                if os.path.exists("/usr/share/applications/pesterchum.desktop"):
                    print "Maiming menu item..."
                    os.remove("/usr/share/applications/pesterchum.desktop")
                if os.path.exists(_HOME+"/Pesterchum.desktop"):
                    print "Destroying launcher..."
                    os.remove(_HOME+"/Pesterchum.desktop")
                elif os.path.exists(_HOME+"/Desktop/Pesterchum.desktop"):
                    print "Destroying launcher..."
                    os.remove(_HOME+"/Desktop/Pesterchum.desktop")
                else:
                    print "Unable to find launcher, non destroyed"
                break
            elif remove.lower() == "n":
                print "Aborting uninstallation process"
                break
            else:
                print "Invalid input, try again"
except KeyboardInterrupt:
    print ""
except Exception as e:
    error = -1
finally:
    if error == -1:
        print "Oh noes!! It seems an error has occurred!"
        lineN = traceback.extract_tb(sys.exc_info()[2])[-1][1]
        print "The error occurred on line %s:" % lineN
        formatted_lines = traceback.format_exc().splitlines()
        print "    '" + formatted_lines[-2] + "'"
        print formatted_lines[-1]

        while 1:
            print "\nWould you like to (s)end a bug report,"
            send = raw_input("view the (f)ull error message, or (n)either? [s/f/n]: ")
            if send.lower() == "n":
                act = 2;break
            elif send.lower() == "s":
                act = 0;break
            elif send.lower() == "f":
                print "!---------------BEGIN ERROR MESSAGE---------------!"
                for l in formatted_lines:
                    print l
                print "!----------------END ERROR MESSAGE----------------!"
                send = raw_input("Would you like to send this error message? [y/n]: ")
                if send.lower() == "y":
                    act = 0;break
                elif send.lower() == "n":
                    act = 2;break
            else:
                print "What was that?"
        if act == 2:
            print "Okay"
        elif act == 0:
            print "Thank you for taking time out of your day to complete a bug report."
            print "Fields marked with an asterisk (*) are required."
            name = raw_input("Your Name: ")
            while 1:
                os = raw_input("OS (include version) (ex. Ubuntu 10.10) [*]: ")
                if os: break
                else: print "This field is required."
            while 1:
                msg = raw_input("Short description of problem [*]: ")
                if msg: break
                else: print "This field is required."
            import urllib, json
            data = urllib.urlencode({"name":name, "os":os, "msg":msg, "short":formatted_lines[-1], "long":json.dumps(formatted_lines)})
            try:
                print "Sending..."
                f = urllib.urlopen("http://distantsphere.com/pc/easyInstall.php", data)
                text = f.read()
                print text
                if text == "success!":
                    print "Sent!"
                else:
                    print "There seems to have been a problem sending your bug report! ):"
            except:
                print "There seems to have been a problem sending your bug report! ):"
