#!/usr/bin/python2
# -*- coding: utf-8 -*-
# import MySQL module
#used to import the zipcode/timezone/nfs info fromMBE
import MySQLdb
import sys
import getopt
import socket
import urllib2
socket.setdefaulttimeout(10)

try:
    from json import loads as jsonparse
    nojson = False
except ImportError:
    try:
        from simplejson import loads as jsonparse
        nojson = False
    except ImportError:
        def jsonparse(js):
            if unsafe:
                return eval(js)
            raise RuntimeError("Neither the json or simplejson module is available.\nUse the --unsafe option to use python eval() as an ad-hoc json decoder")


def no_update(data):
    print "*  not updating %s, because a value is already present" %data



def usage():
    print " -h --help"
    print " -d  --installdb"
    print " -m --masterdb"
    print " -n  --hostname of current machine"

def latlong2_olsen(lat,lng):
    olsenttz = ''
    geo_url = "http://api.geonames.org/timezoneJSON?lat=%s&lng=%s&username=linhes_timezone" %(lat,lng)
    try:
        json_stream = urllib2.urlopen(geo_url,timeout=10)
        json_dict = jsonparse(json_stream.read().replace("\r\n",""))
        olsenttz = json_dict['timezoneId']
    except:
        print "error with geonames"

    return olsenttz

def geo_locate():
    print "    Trying to geo locate in timezip.py"
    gtz = ''
    gtz_region = ''
    gtz_subregion = ''
    #get long/lat from ip
    try:
        geo_url = "http://www.geobytes.com/IpLocator.htm?GetLocation&template=json.txt"
        json_stream = urllib2.urlopen(geo_url,timeout=10)
        json_dict = jsonparse(json_stream.read().replace("\r\n",""))['geobytes']
        latitude =  json_dict['latitude']
        longitude = json_dict['longitude']
    except:
        print "error with geobytes/geolocate"
        latitude = ''
        longitude = ''

    if latitude != '':
        try:
            olsenttz = latlong2_olsen (latitude,longitude)
            gtz = olsenttz
            gtz_region , gtz_subregion = olsenttz.split("/")
        except:
            print "error with geolocate"



    return gtz, gtz_region , gtz_subregion


def printvars():
    print "masterdb: " + masterdb
    print "installdb:" + installdb
    print "hostname: " + thishostname
    print "BEhostname:" + BEhostname
    #print "zipcode:" + zipcode
    print "timezone:" + tz
    print "timezone region:" + tz_region
    print "timezone subregion:" + tz_subregion
    print "nfsip:" + nfsip
    print "nfstoggle:" + nfstoggle
    print "nfsmount:"  + nfsmount
    print "nfsshare:"  + nfsshareall
    #print "hobbitclient:" + hobbitclient
    print "windowmanager:" + windowmanager
    print "windowmanager style:" + wmstyle
    print "Gallery Dir:" + gallerydir
    print "Music dir:" + musicdir
    print "Music template:" + filenametemplate

    for key,value in video_dict.items():
        print "%s: %s" %(key,value)

    print "-----------------------------------"
    print "\n\n\n"


# connect
def selectvars():

    global BEhostname
    global zipcode
    global tz
    global tz_region
    global tz_subregion
    global nfsip
    global nfstoggle
    global nfsmount
    global nfsshareall
    #global hobbitclient
    global windowmanager
    global wmstyle
    global musicdir
    global gallerydir
    global filenametemplate
    #video parent level
    global video_dict

    db = MySQLdb.connect(host=masterdb, user="mythtv", passwd="mythtv", db="mythconverg")
    # create a cursor
    cursor = db.cursor()
    # execute SQL statement

    try:
        cursor.execute("select hostname from settings where value='BackendServerIP' and data=(%s)",(masterdb))
        result = cursor.fetchone()
        BEhostname=result[0]
    except TypeError:
        BEhostname=""

    try:
        cursor.execute("select data from settings where value='HostCentralNFSIP' and hostname=(%s)",(BEhostname))
        result = cursor.fetchone()
        nfsip=result[0]
    except TypeError:
        nfsip=""

    try:
        cursor.execute("select data from settings where value='HostHaveCentralNFS' and hostname=(%s)",(BEhostname))
        result = cursor.fetchone()
        nfstoggle=result[0]
    except TypeError:
        nfstoggle="no"


    try:
        cursor.execute("select data from settings where value='HostNFSmountpoint' and hostname=(%s)",(BEhostname))
        result = cursor.fetchone()
        nfsmount=result[0]
    except TypeError:
        nfsmount=""

    try:
        cursor.execute("select data from settings where value='HostCentralNFSallhosts' and hostname=(%s)",(BEhostname))
        result = cursor.fetchone()
        nfsshareall=result[0]
    except TypeError:
        nfsshareall="0"



    try:
        #cursor.execute("select data from settings where value='HostTimeZonetemp' and hostname=(%s)",(BEhostname))
        cursor.execute("select data from settings where value='HostTimeZone' and hostname=(%s)",(BEhostname))
        result = cursor.fetchone()
        tz=result[0]
    except TypeError:
        tz = ""

    if tz == "":
        tz,tz_region, tz_subregion = geo_locate()
    else:
        try:
            cursor.execute("select data from settings where value='HostTimeZoneRegion' and hostname=(%s)",(BEhostname))
            result = cursor.fetchone()
            tz_region=result[0]
        except TypeError:
            tz_region=""

        tempsubregion="HostTimeZoneRegion_" + tz_region
        try:
            cursor.execute("select data from settings where value=%s and hostname=(%s)",(tempsubregion,BEhostname))
            result = cursor.fetchone()
            tz_subregion=result[0]
        except TypeError:
            tz_subregion=""


###############
    #if  ( thishostname != BEhostname ):
        #cursor.execute("select data from settings where value='GlobalServiceHobbitserver'")
        #result = cursor.fetchone()
        #try:
            #hobbitclient=result[0]
        #except:
            #hobbitclient="1"
    #else:
            #hobbitclient="1"



    try:
        cursor.execute("select data from settings where value='HostWindowManager' and hostname=(%s)",(BEhostname))
        result = cursor.fetchone()
        windowmanager=result[0]
    except TypeError:
        windowmanager=""


    try:
        cursor.execute("select data from settings where value='HostEnhancedWMStyle' and hostname=(%s)",(BEhostname))
        result = cursor.fetchone()
        wmstyle=result[0]
    except TypeError:
        wmstyle=""


    try:
        cursor.execute("select data from settings where value='MusicLocation' and hostname=(%s)",(BEhostname))
        result = cursor.fetchone()
        musicdir=result[0]
    except TypeError:
        musicdir=""


    try:
        cursor.execute("select data from settings where value='FilenameTemplate' and hostname=(%s)",(BEhostname))
        result = cursor.fetchone()
        filenametemplate=result[0]
    except TypeError:
        filenametemplate=""

    try:
        cursor.execute("select data from settings where value='GalleryDir' and hostname=(%s)",(BEhostname))
        result = cursor.fetchone()
        gallerydir=result[0]
    except TypeError:
        gallerydir=""

#   video parental level
    video_list=['VideoAdminPassword',
                'VideoAdminPasswordThree',
                'VideoAdminPasswordTwo',
                'VideoAggressivePC',
                'VideoDefaultParentalLevel',
                'mythvideo.ParentalLevelFromRating']

    for i in video_list:
        sql_query="select data from settings where value='%s' and hostname='%s'" %(i,BEhostname)
        try:
            cursor.execute(sql_query)
            result = cursor.fetchone()
            video_dict[i]=result[0]
        except TypeError:
                video_dict[i]=''

def insertvars():

    db = MySQLdb.connect(host=installdb, user="mythtv", passwd="mythtv", db="mythconverg")
    cursor = db.cursor()
##inserting the zipcode
    #cursor.execute("select * from settings where value='HostZipcode' and hostname=(%s)",(thishostname))
    #result = cursor.fetchone()
    #if ( zipcode!="" ):
        #if (result == None):
            #cursor.execute("INSERT INTO  settings (value,data,hostname) VALUES ('HostZipcode',(%s),(%s))",(zipcode,thishostname))
            #print "inserting zipcode"
        #else:
            #cursor.execute("update settings set data=(%s) where hostname=(%s) and value='HostZipcode'",(zipcode,thishostname))
            #print "updating zipcode"

#inserting the timezone

    if ( tz != ""):
        cursor.execute("select *  from settings where value='HostTimeZone' and hostname=(%s)",(thishostname))
        result = cursor.fetchone()
        if (result == None):
            cursor.execute("INSERT INTO  settings (value,data,hostname) VALUES ('HostTimeZone',(%s),(%s))",(tz,thishostname))
            print "inserting timezone"
        else:
            cursor.execute("update settings set data=(%s) where hostname=(%s) and value='HostTimeZone'",(tz,thishostname))
            print "updating timezone"

        cursor.execute("select *  from settings where value='HostTimeZoneRegion' and hostname=(%s)",(thishostname))
        result = cursor.fetchone()
        if (result == None):
            cursor.execute("INSERT INTO  settings (value,data,hostname) VALUES ('HostTimeZoneRegion',(%s),(%s))",(tz_region,thishostname))
            print "inserting timezone region"
        else:
            cursor.execute("update settings set data=(%s) where hostname=(%s) and value='HostTimeZoneRegion'",(tz_region,thishostname))
            print "updating timezone region"

        tempsubregion="HostTimeZoneRegion_" + tz_region

        cursor.execute("select *  from settings where value=%s and hostname=(%s)",(tempsubregion,thishostname))
        result = cursor.fetchone()
        if (result == None):
            cursor.execute("INSERT INTO  settings (value,data,hostname) VALUES ((%s),(%s),(%s))",(tempsubregion,tz_subregion,thishostname))
            print "inserting timezone subregion"
        else:
            cursor.execute("update settings set data=(%s) where hostname=(%s) and value=(%s)",(tz_subregion,thishostname,tempsubregion))
            print "updating timezone subregion"


##start of NFSIP
    if nfstoggle == "yes" :
        print "BE has a central storage"
        #if nfsshareall == "0":
            #print "BE is not sharing central, starting config"
        if ( nfsip != ""):
            cursor.execute("select data from settings where value='HostCentralNFSIP' and hostname=(%s)",(thishostname))
            result = cursor.fetchone()
            if (result == None):
                cursor.execute("INSERT INTO  settings (value,data,hostname) VALUES ('HostCentralNFSIP',(%s),(%s))",(nfsip,thishostname))
                print "inserting nfsip"
            else:
                no_update("HostCentralNFSIP")
                #cursor.execute("update settings set data=(%s) where hostname=(%s) and value='HostCentralNFSIP'",(nfsip,thishostname))
                #print "updating nfsip"
        if ( nfsmount !="") :
            cursor.execute("select data from settings where value='HostNFSmountpoint' and hostname=(%s)",(thishostname))
            result = cursor.fetchone()
            if (result == None):
                cursor.execute("INSERT INTO  settings (value,data,hostname) VALUES ('HostNFSmountpoint',(%s),(%s))",(nfsmount,thishostname))
                print "inserting nfsmountpoint"
            else:
                no_update("nfsmount")
                #cursor.execute("update settings set data=(%s) where hostname=(%s) and value='HostNFSmountpoint'",(nfsmount,thishostname))
                #print "updating nfsmount"
        #else:
            #print "BE is sharing, config sync skipped"
    else:
        print "BE has no central storage"

    #windowmanager
    if windowmanager != "":
        cursor.execute("select *  from settings where value='HostWindowManager' and hostname=(%s)",(thishostname))
        result = cursor.fetchone()
        if (result == None):
            cursor.execute("INSERT INTO  settings (value,data,hostname) VALUES ('HostWindowManager',(%s),(%s))",(windowmanager,thishostname))
            print "inserting windowmanager"
        else:
            no_update("windowmanager")
            #cursor.execute("update settings set data=(%s) where hostname=(%s) and value='HostWindowManager'",(windowmanager,thishostname))
            #print "updating windowmanager"


    if wmstyle != "" :
        cursor.execute("select *  from settings where value='HostEnhancedWMStyle' and hostname=(%s)",(thishostname))
        result = cursor.fetchone()
        if (result == None):
            cursor.execute("INSERT INTO  settings (value,data,hostname) VALUES ('HostEnhancedWMStyle',(%s),(%s))",(wmstyle,thishostname))
            print "inserting windowmanager style"
        else:
            no_update("wm_style")
            #cursor.execute("update settings set data=(%s) where hostname=(%s) and value='HostEnhancedWMStyle'",(wmstyle,thishostname))
            #print "updating windowmanager style"

#music and gallery

    if ( musicdir != "" ):
        cursor.execute("select * from settings where value='MusicLocation' and hostname=(%s)",(thishostname))
        result = cursor.fetchone()
        if (result == None):
            cursor.execute("INSERT INTO  settings (value,data,hostname) VALUES ('MusicLocation',(%s),(%s))",(musicdir,thishostname))
            print "inserting musicdir"
        else:
            #no_update("musicdir")
            cursor.execute("update settings set data=(%s) where hostname=(%s) and value='MusicLocation'",(musicdir,thishostname))
            print "updating musicdir"

    if ( filenametemplate != "" ):
        cursor.execute("select * from settings where value='FilenameTemplate' and hostname=(%s)",(thishostname))
        result = cursor.fetchone()
        if (result == None):
            cursor.execute("INSERT INTO  settings (value,data,hostname) VALUES ('FilenameTemplate',(%s),(%s))",(filenametemplate,thishostname))
            print "inserting filenametemplate"
        else:
            no_update("filenametemplate")
            #cursor.execute("update settings set data=(%s) where hostname=(%s) and value='FilenameTemplate'",(filenametemplate,thishostname))
            #print "updating filenametemplate"

    if ( gallerydir != "" ):
        cursor.execute("select * from settings where value='GalleryDir' and hostname=(%s)",(thishostname))
        result = cursor.fetchone()
        if (result == None):
            cursor.execute("INSERT INTO  settings (value,data,hostname) VALUES ('GalleryDir',(%s),(%s))",(gallerydir,thishostname))
            print "inserting gallerydir"
        else:
            #no_update("gallerydir")
            cursor.execute("update settings set data=(%s) where hostname=(%s) and value='GalleryDir'",(gallerydir,thishostname))
            print "updating gallerydir"

# parental level
    for key,value in video_dict.items():
        if ( value != "" ):
            sql_query = "select * from settings where value='%s' and hostname='%s'" %(key,thishostname)
            cursor.execute(sql_query)
            result = cursor.fetchone()
            if (result == None):
                insert_sql ="INSERT INTO  settings (value,data,hostname) VALUES ('%s','%s','%s')" %(key,value,thishostname)
                cursor.execute(insert_sql)
                print "inserting %s" %(key)
            else:
                no_update(key)
                #update_sql="update settings set data='%s' where hostname='%s' and value='%s'" %(value,thishostname,key)
                #cursor.execute(update_sql)
                #print "updating %s" %(key)




def main(argv):
    global masterdb
    global installdb
    global thishostname
    thishostname=""
    global BEhostname
    global zipcode
    global tz
    global tz_region
    global tz_subregion
    #global nfsip
    #global hobbitclient
    global musicdir
    global gallerydir
    global filenametemplate

    global video_dict
    video_dict = {}

    try:
        opts, args = getopt.getopt(argv, "hm:d:n:", ["help", "masterdb=", "installdb=" , "hostname=" ] )
    except getopt.GetoptError:
        sys.exit(2)
    for opt, arg in opts:
        if opt in ("-h", "--help"):
             usage()
             sys.exit()
        elif opt in ( "-d" , "--installdb"):
             installdb = arg
        elif opt in ("-m", "--masterdb"):
             masterdb = arg
        elif opt in ("-n", "--hostname"):
             thishostname = arg

    if ( thishostname == "" ):
         thishostname = socket.gethostname()

    selectvars()
    printvars()
    insertvars()
if __name__ == "__main__":
    main(sys.argv[1:])