#!/usr/bin/env python3
import json
import base64
from .api_client import APIClientManager
from .telegram import RedisNickStore, RedisStickerURLStore
from .counter import Counter


def dump_meta(r, tofilename):
    backup = {}

    rkeys = [
        APIClientManager.clients_name_key,
        RedisNickStore.NICKNAME_KEY, RedisNickStore.USERNAME_KEY,
        RedisStickerURLStore.STICKER_KEY,
    ]

    for rk in rkeys:
        b = {}
        for k, v in r.hgetall(rk).items():
            try:
                k, v = k.decode('utf-8'), v.decode('utf-8')
            except:
                continue
            b[k] = v
        backup[rk] = b

    backup[APIClientManager.clients_key] = {
        k.decode('utf-8'): base64.b64encode(v).decode('utf-8')
        for k, v in r.hgetall(APIClientManager.clients_key).items()
    }

    counters = [Counter(r, name) for name in ('qiniu', )]
    for c in counters:
        backup[c.key] = c.incr()

    with open(tofilename, 'w') as f:
        json.dump(backup, f, indent=4)


def load_meta(r, fromfile):
    with open(fromfile, 'r') as f:
        backup = json.load(f)

    for rk, b in backup.items():
        if rk == APIClientManager.clients_key:
            for token_id, b64token in b.items():
                r.hset(rk, token_id, base64.b64decode(b64token))
        elif isinstance(b, int):
            r.set(rk, b)
        elif isinstance(b, dict):
            for k, v in b.items():
                r.hset(rk, k, v)


if __name__ == "__main__":
    import os
    import argparse
    import sys
    from .db import get_redis

    parser = argparse.ArgumentParser("Import/Export data from/to json")
    subparsers = parser.add_subparsers(dest="command", help="valid subcommands")
    dp = subparsers.add_parser('dump', aliases=['d'], help="dump data")
    dp.add_argument('-d', '--dump-dir', help="where to store the backup json")
    lp = subparsers.add_parser('load', aliases=['l'], help="load data")
    lp.add_argument('--meta-file', help='json is metadata (nicks, cache, etc.)')
    subparsers.add_parser('help', help="print help")

    args = parser.parse_args()

    if args.command == "help":
        parser.print_help()
        sys.exit(0)

    r = get_redis()
    mgr = APIClientManager(r)

    if args.command in ('dump', 'd'):
        dump_meta(r, os.path.join(args.dump_dir, "meta.json"))
    elif args.command in ('load', 'l'):
        load_meta(r, args.meta_file)


# vim: ts=4 sw=4 sts=4 expandtab