from fabric.api import cd, run, sudo, put
from io import StringIO


base_dir = '/usr/local'
hostname = 'searx.me'
searx_dir = base_dir + '/searx'
searx_ve_dir = searx_dir + '/searx-ve'
current_user = run('whoami').stdout.strip()

uwsgi_file = '''
[uwsgi]
# Who will run the code
uid = {user}
gid = {user}

# Number of workers
workers = 8

# The right granted on the created socket
chmod-socket = 666

# Plugin to use and interpretor config
single-interpreter = true
master = true
plugin = python

# Module to import
module = searx.webapp

# Virtualenv and python path
virtualenv = {searx_ve_dir}
pythonpath = {searx_dir}
chdir = {searx_dir}/searx
'''.format(user=current_user,
           searx_dir=searx_dir,
           searx_ve_dir=searx_ve_dir)

nginx_config = '''
server {{
    listen 80;
    server_name {hostname};
    server_name www.{hostname};
    root /usr/local/searx;

    location / {{
        include uwsgi_params;
        uwsgi_pass unix:/run/uwsgi/app/searx/socket;
    }}
}}
'''.format(hostname=hostname)


def stop():
    sudo('/etc/init.d/uwsgi stop')


def start():
    sudo('/etc/init.d/uwsgi start')


def restart():
    sudo('/etc/init.d/uwsgi restart')


def init():
    if not run('test -d ' + searx_dir, warn_only=True).failed:
        return

    sudo('apt-get update')

    sudo('apt-get install git'
         ' build-essential'
         ' libxslt-dev'
         ' python-dev'
         ' python-virtualenv'
         ' python-pybabel'
         ' zlib1g-dev'
         ' uwsgi'
         ' uwsgi-plugin-python'
         ' nginx')

    sudo('mkdir -p ' + base_dir)

    put(StringIO(nginx_config), '/etc/nginx/sites-enabled/searx', use_sudo=True)
    sudo('/etc/init.d/nginx restart')

    with cd(base_dir):
        sudo('git clone https://github.com/searx/searx')

    sudo('chown -R {user}:{user} {searx_dir}'.format(user=current_user, searx_dir=searx_dir))
    put(StringIO(uwsgi_file), searx_dir + '/uwsgi.ini')
    sudo('ln -s {0}/uwsgi.ini /etc/uwsgi/apps-enabled/searx.ini'.format(searx_dir))

    run('virtualenv {0}'.format(searx_ve_dir))

    with cd(searx_dir):
        run('source {0}/bin/activate && pip install -r requirements.txt'.format(searx_ve_dir))

    start()


def deploy():
    init()

    with cd(searx_dir):
        run("git stash", warn_only=True)
        run("git pull origin master")
        run("git stash pop", warn_only=True)

    restart()


def clean():
    sudo('rm -rf {searx_dir}'.format(searx_dir=searx_dir), warn_only=True)
    sudo('rm /etc/uwsgi/apps-enabled/searx.ini', warn_only=True)
    sudo('rm /etc/nginx/sites-enabled/searx', warn_only=True)
