#!/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 os, sys, 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"