# -*- coding: utf-8 -*-
import logging, mv_common
import re
import os


def mplayer_saver_check (cmd,templatefile):
    logging.debug("    Checking for heartbeat command in mplayer.conf")
    mplayerconf = "/etc/mplayer/mplayer.conf"
    if not os.path.exists(mplayerconf):
        logging.debug("    copying in mplayer template file")
        mv_common.cp_and_log(templatefile, mplayerconf)

    try:
        f = open(mplayerconf, 'r')
        mplayerconf_contents = f.readlines()
        f.close()
    except:
        logging.debug("    Couldn't open %s for reading",mplayerconf)
        mplayerconf_contents = "#\n"

    try:
        f = open(mplayerconf, 'w')
    except:
        logging.debug("    Couldn't open %s for writing",mplayerconf)
        return

    for line in mplayerconf_contents:
        if re.match("^.*stop-xscreensaver",line):
            continue
        elif re.match("^.*heartbeat-cmd",line):
            continue
        else:
            f.write(line)

    f.write("stop-xscreensaver = 0\n")
    line='''heartbeat-cmd="%s"\n''' %cmd
    f.write(line)
    f.close()


def killxscreensaver():
    logging.info("    Stopping xscreensaver")
    cmd="xscreensaver-command --exit "
    mv_common.runcmd(cmd)
    cmd="killall xscreensaver "
    mv_common.runcmd(cmd)

def killgscreensaver():
    logging.info("    Stopping gnome-screensaver")
    cmd="gnome-screensaver-command --exit "
    mv_common.runcmd(cmd)
    cmd="killall gnome-screensaver "
    mv_common.runcmd(cmd)


def setup_x_screensaver(idle,theme,screenconfigfile,templatefile):
    logging.info("    Configuring X screensaver")
    killgscreensaver()
    logging.debug("    Why can't xscreensaver have a nice configuration !")

    if not os.path.exists(screenconfigfile):
        logging.debug("   copying in new template file")
        mv_common.cp_and_log(templatefile,screenconfigfile)

    try:
        f = open(screenconfigfile, 'r')
        screenconfigcontents=f.readlines()
        f.close()
    except:
        logging.info("Couldn't open %s for reading",screenconfigfile)
        return
    try:
        f = open(screenconfigfile, 'w')
    except:
        logging.info("Couldn't open %s for writing",screenconfigfile)
        return

    startline=0
    foundline=0

    for k, line in enumerate(screenconfigcontents):
        if re.match("programs:",line):
            startline = k
        if re.search(theme,line):
            foundline = k
    themenumber=foundline-startline-1

    for line in screenconfigcontents:
        if re.match("selected.*$",line):
            continue

        if re.match("timeout",line):
            logging.info("    Setting idletime to %s",idle)
            outline = "timeout:   0:%s:00 \n" %idle
            f.write(outline)
        elif re.match("mode",line):
            if theme == "Random":
                logging.info("    Setting theme to %s", "Random")
                outline = "mode:    random \n"
                f.write(outline)
                outline = "selected:    -1 \n"
                f.write(outline)
                continue

            elif theme == "Blank":
                logging.info("    Setting theme to %s", "blank")
                outline = "mode:    blank \n"
                f.write(outline)
                outline = "selected:    -1 \n"
                f.write(outline)
                continue

            else:
                logging.info("    Setting theme to %s", theme)
                outline = "mode:    one\n"
                f.write(outline)
                logging.debug("    Theme number is %s",themenumber)
                outline = "selected:    %s\n" %themenumber
                f.write(outline)
                continue

        else:
            outline = line
            f.write(outline)
    f.close()
    logging.debug("__End of xscreensaver")

def setup_gnome_screensaver(theme,idletime):
    logging.info("    Configuring gnome screensaver")

    logging.info("    Disabling lock screen")
    cmd='''gconftool-2 --direct   --config-source xml:readwrite:/etc/gconf/gconf.xml.mandatory  --type bool   --set /apps/gnome-screensaver/lock_enabled false'''
    mv_common.runcmd(cmd)

    logging.info("    Setting idletime to %s",idletime)
    cmd='''gconftool-2 --direct  --config-source xml:readwrite:/etc/gconf/gconf.xml.mandatory  --type int -s "/apps/gnome-screensaver/idle_delay" %s''' %idletime
    mv_common.runcmd(cmd)

    logging.info("    Setting mode to single")
    cmd='''gconftool-2 --direct  --config-source xml:readwrite:/etc/gconf/gconf.xml.mandatory  --type string -s "/apps/gnome-screensaver/mode" single'''
    mv_common.runcmd(cmd)

    if theme == "Random":
        logging.info("    setting theme to random")
        cmd='''gconftool-2 --direct  --config-source xml:readwrite:/etc/gconf/gconf.xml.mandatory  --type string -s "/apps/gnome-screensaver/mode" random'''
        mv_common.runcmd(cmd)

    elif theme == "Blank":
        logging.info("    setting theme to blank")
        cmd='''gconftool-2 --direct  --config-source xml:readwrite:/etc/gconf/gconf.xml.mandatory  --type string -s "/apps/gnome-screensaver/themes" blank'''
        mv_common.runcmd(cmd)

    else:
        logging.info("    setting theme to %s",theme)
        cmd='''gconftool-2  --direct  --config-source xml:readwrite:/etc/gconf/gconf.xml.mandatory --set --type list --list-type=string /apps/gnome-screensaver/themes [screensavers-%s]''' %theme
        mv_common.runcmd(cmd)

    killxscreensaver()
    logging.info("__End gnome screensaver")


def start_screensaver(screensaver):
    logging.info("    Checking if screensaver needs to be started")
    if mv_common.check_service("frontend"):
        killxscreensaver()
        logging.info("    Frontend is running, starting screensaver")
        line='''su mythtv -c "DISPLAY=localhost:0 xscreensaver  -no-splash 2>&1 > /dev/null &" \n'''
        #line='''su mythtv -c "DISPLAY=localhost:0 xscreensaver  -no-splash \&" '''
        try:
            fout = open("/tmp/cmd.sh", "w")
            fout.write(line)
            fout.close()
            os.chmod("/tmp/cmd.sh",0755)
            cmd="/tmp/cmd.sh"
            os.system(cmd)
            os.remove("/tmp/cmd.sh")
        except:
            logging.info("    Couldn't start screensaver")




def setup_screensaver (systemconfig,data_config):
    if  mv_common.read_config(mv_common.module_config,"screensaver")  == False  :
        logging.info("____Skipping of Screensaver, config disabled____")
        return
    logging.info("____Start of screensaver configuration____")
    screensavertype = systemconfig.get("Screensavertype")
    theme = systemconfig.get("Screensavertheme")
    idletime = systemconfig.get("Screensaveridle")
    configfile = data_config.MYTHHOME+"/.xscreensaver"
    templatefile = systemconfig.get("TEMPLATES")+"/xscreensaver.template"
    mtemplate = systemconfig.get("TEMPLATES")+"/mplayer.conf.template"

    if screensavertype == "xscreensaver":
        mv_common.pacinstall("xscreensaver")
        mv_common.pacremove("gnome-screensaver")
        setup_x_screensaver(idletime, theme, configfile, templatefile)
        mplayer_saver_check("/usr/bin/xscreensaver-command -deactivate &",mtemplate)
        start_screensaver("xscreensaver")

    elif screensavertype == "gscreensaver":
        mv_common.pacinstall("xscreensaver")
        mv_common.pacinstall("gnome-screensaver")
        setup_gnome_screensaver(theme,idletime)
        mplayer_saver_check("/usr/bin/gnome-screensaver-command -p &",mtemplate)

    elif screensavertype == "none":
        mv_common.pacremove("xscreensaver")
        mv_common.pacremove("gnome-screensaver")
        killgscreensaver()
        killxscreensaver()

    elif screensavertype == "tinker" :
        logging.debug("    screensaver tinker mode detected")
    else:
        logging.debug("   Unknown screensaver")
    logging.info("__End of screensaver\n")