#!/usr/bin/env python
import argparse
import logging
import logging.config
import os.path
import sys

import asyncio
from syncrypt.models import Vault
from syncrypt.app import SyncryptApp
from syncrypt.config import AppConfig, Config
from syncrypt.utils.daemon import Daemon
from syncrypt.utils.logging import setup_logging

LOGLEVELS = ['CRITICAL', 'ERROR', 'WARN', 'INFO', 'DEBUG']

parser = argparse.ArgumentParser(description='Run Syncrypt client')
parser.add_argument('-d,--detach', action='store_true',
        dest='detach', help='Detach from console')
parser.add_argument('-c,--config', action='store', type=str,
        dest='config', help='Config file')
parser.add_argument('-l', metavar='LOGLEVEL', type=str, default='INFO',
        dest='loglevel', choices=LOGLEVELS, help='Log level: ' + ', '.join(LOGLEVELS))

config = parser.parse_args()

app_config = AppConfig(config.config)

# setup logging
log_dir = os.path.join(app_config.config_dir, 'logs')
os.makedirs(log_dir, exist_ok=True)
setup_logging(config.loglevel, logfile=os.path.join(log_dir, 'syncrypt_daemon.log'))

app = SyncryptApp(app_config)

def run_syncrypt():
    loop = asyncio.get_event_loop()
    loop.run_until_complete(app.start())
    loop.run_forever()

if config.detach:
    class SyncryptDaemon(Daemon):
        def run(self):
            run_syncrypt()
    syncryptd = SyncryptDaemon('/tmp/syncrypt.pid')
    getattr(syncryptd, config.command)()
else:
    run_syncrypt()
