#!/usr/bin/env python3
import subprocess
from configobj import ConfigObj
import uuid
from MAPI.Util import *

import kopano

# Try simplejson if json is not available
try:
    import json
except ImportError:
    import simplejson as json


def encode(value):
    output = subprocess.check_output(["php", "deencode.php", "encode", value])
    return output.strip()


def opt_args():
    parser = kopano.parser('skpcfm')
    parser.add_option("--user", dest="user", action="store", help="username")
    parser.add_option("--ssl", dest="ssl", action="store_true", help="Use localhost on port 443")
    parser.add_option("--hostname", dest="hostname", action="store", help="hostname")

    parser.add_option("--file", dest="file", default=[], action="store", help="config file(s) separate by ',' ")
    parser.add_option("--default", dest="default", action="store_true",
                      help="use default user and password in the configfile")

    return parser.parse_args()


def read_settings(user):
    try:
        mapisettings = user.store.prop(PR_EC_WEBACCESS_SETTINGS_JSON).value.decode('utf-8')
        settings = json.loads(mapisettings)
    except Exception as e:
        print('{}: Has no or no valid WebApp settings creating empty config tree'.format(user.name))
        settings = json.loads('{"settings": {"zarafa": {"v1": {"contexts": {"mail": {}}}}}}')
    return settings


def write_settings(user, setting):
    try:
        user.store.create_prop(PR_EC_WEBACCESS_SETTINGS_JSON, setting.encode('utf-8'))
    except Exception as e:
        print('{}: Error Writing WebApp settings for user: {}'.format(e, user.name))


def files(options):
    filesjson = {'accounts': {}}

    files = options.file.split(',')
    for file in files:
        configfile = ConfigObj(file)
        if configfile['setting']['use_zarafa_credentials']:
            username = configfile['setting']['default_user']
        else:
            username = options.user
        password = encode(configfile['setting']['default_password'])
        backendoptions = {
            'ftp': {"backend_features": {
                "Streaming": "true", }},
            'webdav': {"backend_features": {
                "Quota": "true",
                "VersionInfo": "true"}},
            'owncloud': {"backend_features": {
                "Quota": "true",
                "Sharing": "true",
                "VersionInfo": "true"}},
            'smb': {"backend_features": {
                "Quota": "true",
                "Streaming": "true",
                "VersionInfo": "true"}},
        }

        if file == 'seafile.cfg':
            password = encode(options.user)
            username = kopano.Server(options).user(options.user).email

        if 'local' in file:
            if options.ssl:
                port = '443'
                address = options.hostname
                ssl = 'true'
            else:
                port = configfile['setting']['server_port']
                address = configfile['setting']['server_address']
                ssl = configfile['setting']['server_ssl']
        else:
            port = configfile['setting']['server_port']
            address = configfile['setting']['server_address']
            ssl = configfile['setting']['server_ssl']
        id = str(uuid.uuid4())
        filesjson['accounts'][id] = {
            "status": "ok",
            "backend_config": {
                "server_path": encode(configfile['setting']['server_path']).decode('utf-8'),
                "workgroup": encode(configfile['setting']['workgroup']).decode('utf-8'),
                "server_address": encode(address).decode('utf-8'),
                "server_ssl": ssl,
                "current_account_id": encode('d4cacda458a2a26c301f2b7d75ada530').decode('utf-8'),
                "use_zarafa_credentials": configfile['setting']['use_zarafa_credentials'],
                "user": encode(username).decode('utf-8'),
                "password": password.decode('utf-8'),
                "server_port": encode(port).decode('utf-8')
            },
            "cannot_change": False,
            "name": configfile['setting']['name'],
            "status_description": "Account is ready to use.",
            "id": id,
            "backend_features": backendoptions[configfile['setting']['type'].lower()]['backend_features'],
            "backend": configfile['setting']['type']
        }

        if configfile['setting']['type'].lower() == 'ftp':
            filesjson['accounts'][id]['backend_config']['server_pasv'] = configfile['setting']['server_pasv']

    return filesjson


def main():
    options, args = opt_args()

    server = kopano.Server(options)
    user = server.user(options.user)
    webappsettings = read_settings(user)
    if not webappsettings['settings']['zarafa']['v1'].get('plugins'):
        webappsettings['settings']['zarafa']['v1']['plugins'] = {}
    webappsettings['settings']['zarafa']['v1']['plugins']['files'] = files(options)
    write_settings(user, json.dumps(webappsettings))


if __name__ == '__main__':
    main()