# coding=utf-8

import argparse
import sys

from spnr import code
from spnr import hash
from spnr import json
from spnr import qr
from spnr import table
from spnr import time


def init_qr_parser(parser):
    subparsers = parser.add_subparsers(required=True)

    gen_parser = subparsers.add_parser('generate', aliases=['gen', 'g'])
    gen_parser.set_defaults(func=qr.generate)
    gen_group = gen_parser.add_mutually_exclusive_group()
    gen_group.add_argument('-s', '--string', help='content')
    gen_group.add_argument('-f', '--file',
                           help='read content from the file, default stdin',
                           default=sys.stdin,
                           type=argparse.FileType('r'),
                           nargs='?')
    gen_out_group = gen_parser.add_mutually_exclusive_group()
    gen_out_group.add_argument('-S', '--screen', help='show the qrcode on the screen', action='store_true')
    gen_out_group.add_argument('-o', '--output-file',
                               help='output qrcode to a file, default stdout',
                               default=sys.stdout,
                               type=argparse.FileType('w'),
                               nargs='?')

    scan_parser = subparsers.add_parser('scan', aliases=['s'])
    scan_parser.set_defaults(func=qr.scan)
    scan_group = scan_parser.add_mutually_exclusive_group()
    scan_group.add_argument('-c', '--camera', help='scan a qrcode from the camera', action='store_true')
    scan_group.add_argument('-s', '--screen', help='scan a qrcode from the screen', action='store_true', default=True)
    scan_group.add_argument('-f', '--file',
                            help='scan a qrcode from the picture file',
                            type=argparse.FileType('rb'))


def init_table_parser(parser):
    parser.set_defaults(func=table.handle)
    group = parser.add_mutually_exclusive_group()
    group.add_argument('-m', '--matrix', help='a matrix literal')
    group.add_argument('-f', '--file',
                       help='read a matrix literal or csv from the file, default stdin',
                       default=sys.stdin,
                       type=argparse.FileType('r'),
                       nargs='?')
    parser.add_argument('--row-span', choices=['head', 'none', 'all'], help='row span mode', default='head')


def init_time_parser(parser):
    parser.set_defaults(func=time.handle)
    group = parser.add_mutually_exclusive_group()
    group.add_argument('-t', '--timestamp', type=float, help='timestamp', )
    group.add_argument('-T', '--time', help='time in string')
    parser.add_argument('-f', '--format', help='time format', default='%Y-%m-%d %H:%M:%S')
    parser.add_argument('-u', '--utc', help='use utc time', action='store_true')


def init_json_parser(parser):
    parser.set_defaults(func=json.handle)
    group = parser.add_mutually_exclusive_group()
    group.add_argument('-s', '--string', help='a json string')
    group.add_argument('-f', '--file',
                       help='read the json from a file, default stdin',
                       default=sys.stdin,
                       type=argparse.FileType('r'),
                       nargs='?')
    parser.add_argument('-i', '--indent', type=int, help='indent', default=2)


def init_code_parser(parser):
    parser.set_defaults(func=code.handle)
    group = parser.add_mutually_exclusive_group(required=True)
    group.add_argument('-e', '--encode', help='encode a string')
    group.add_argument('-d', '--decode', help='decode a string')
    parser.add_argument('-m', '--mode', choices=['base64', 'url'], help='code mode', required=True)


def init_hash_parser(parser):
    parser.set_defaults(func=hash.handle)
    group = parser.add_mutually_exclusive_group()
    group.add_argument('-s', '--string', help='hash a string')
    group.add_argument('-f', '--file',
                       help='hash a file, default stdin',
                       default=sys.stdin,
                       type=argparse.FileType('rb'),
                       nargs='?')
    parser.add_argument('-a', '--alg', help='hash algorithm', required=True)


def main():
    parser = argparse.ArgumentParser(description='A toolset.', add_help=True)
    subparsers = parser.add_subparsers(required=True)

    qr_parser = subparsers.add_parser('qr')
    init_qr_parser(qr_parser)
    table_parser = subparsers.add_parser('table')
    init_table_parser(table_parser)
    time_parser = subparsers.add_parser('time')
    init_time_parser(time_parser)
    json_parser = subparsers.add_parser('json')
    init_json_parser(json_parser)
    code_parser = subparsers.add_parser('code')
    init_code_parser(code_parser)
    hash_parser = subparsers.add_parser('hash')
    init_hash_parser(hash_parser)

    args = parser.parse_args()
    args.func(args)
