# -*- coding: utf-8 -*-
# @author: RaNaN, vuolter

import os
import sys

import bottle

import pyload.utils.pylgettext as gettext

from jinja2 import Environment, FileSystemLoader, PrefixLoader, FileSystemBytecodeCache

from pyload.Thread import Server
from pyload.Webui.middlewares import StripPathMiddleware, GZipMiddleWare, PrefixMiddleware
from pyload.network.JsEngine import JsEngine
from pyload.utils import decode, formatSize


THEME_DIR  = os.path.abspath(os.path.join(dirname(__file__), "themes"))
PYLOAD_DIR = os.path.abspath(os.path.join(THEME_DIR, "..", "..", ".."))

sys.path.append(PYLOAD_DIR)

SETUP = None
PYLOAD = None

if not Server.core:
    if Server.setup:
        SETUP = Server.setup
        config = SETUP.config
        JS = JsEngine(SETUP)
    else:
        raise Exception("Could not access pyLoad Core")
else:
    PYLOAD = Server.core.api
    config = Server.core.config
    JS = JsEngine(Server.core)

THEME = config.get('webui', 'theme')
DL_ROOT = config.get('general', 'download_folder')
LOG_ROOT = config.get('log', 'log_folder')
PREFIX = config.get('webui', 'prefix')

if PREFIX:
    PREFIX = PREFIX.rstrip("/")
    if not PREFIX.startswith("/"):
        PREFIX = "/" + PREFIX

DEBUG = config.get("general", "debug_mode") or "-d" in sys.argv or "--debug" in sys.argv
bottle.debug(DEBUG)

cache = os.path.join("tmp", "jinja_cache")
if not os.path.exists(cache):
    os.makedirs(cache)

bcc = FileSystemBytecodeCache(cache, '%s.cache')

loader = FileSystemLoader([THEME_DIR, os.path.join(THEME_DIR, THEME)])

env = Environment(loader=loader, extensions=['jinja2.ext.i18n', 'jinja2.ext.autoescape'], trim_blocks=True, auto_reload=False,
                  bytecode_cache=bcc)

from filters import quotepath, path_make_relative, path_make_absolute, truncate, date

env.filters['quotepath'] = quotepath
env.filters['truncate'] = truncate
env.filters['date'] = date
env.filters['path_make_relative'] = path_make_relative
env.filters['path_make_absolute'] = path_make_absolute
env.filters['decode'] = decode
env.filters['type'] = lambda x: str(type(x))
env.filters['formatsize'] = formatSize
env.filters['getitem'] = lambda x, y: x.__getitem__(y)
if PREFIX:
    env.filters['url'] = lambda x: x
else:
    env.filters['url'] = lambda x: PREFIX + x if x.startswith("/") else x

gettext.setpaths([join(os.sep, "usr", "share", "pyload", "locale"), None])
translation = gettext.translation("django", os.path.join(PYLOAD_DIR, "locale"),
    languages=[config.get("general", "language"), "en"],fallback=True)
translation.install(True)
env.install_gettext_translations(translation)

from beaker.middleware import SessionMiddleware

session_opts = {
    'session.type': 'file',
    'session.cookie_expires': False,
    'session.data_dir': './tmp',
    'session.auto': False
}

web = StripPathMiddleware(SessionMiddleware(bottle.app(), session_opts))
web = GZipMiddleWare(web)

if PREFIX:
    web = PrefixMiddleware(web, prefix=PREFIX)

import pyload.webui.app


def run_auto(host="0.0.0.0", port="8000"):
    bottle.run(app=web, host=host, port=port, server="auto", quiet=True)


def run_lightweight(host="0.0.0.0", port="8000"):
    bottle.run(app=web, host=host, port=port, server="bjoern", quiet=True)


def run_threaded(host="0.0.0.0", port="8000", theads=3, cert="", key=""):
    from wsgiserver import CherryPyWSGIServer

    if cert and key:
        CherryPyWSGIServer.ssl_certificate = cert
        CherryPyWSGIServer.ssl_private_key = key

    CherryPyWSGIServer.numthreads = theads

    from pyload.webui.app.utils import CherryPyWSGI

    bottle.run(app=web, host=host, port=port, server=CherryPyWSGI, quiet=True)


def run_fcgi(host="0.0.0.0", port="8000"):
    bottle.run(app=web, host=host, port=port, server=bottle.FlupFCGIServer, quiet=True)