#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import os

import click
import shock
import shock.utils


@click.group()
def cli():
    pass


@cli.command()
def version():
    """
    版本号
    """
    print shock.__version__


@cli.command()
@click.option('--box_class', '-b', default='netkit.box.Box', help='box class')
@click.option('--concurrent', '-c', type=int, default=10, help='spawn users, 10')
@click.option('--reps', '-r', type=int, default=10, help='run times, 10')
@click.option('--processes', '-p', default=1, type=int, help='process count, 1')
@click.option('--url', '-u', help='url, like 127.0.0.1:7777, ws://127.0.0.1:8000/echo', required=True)
@click.option('--msg_cmd', '-m', default=1, type=int, help='msg cmd, 1')
@click.option('--timeout', '-o', default=5, type=int, help='timeout, 5')
def echo(box_class, concurrent, reps, url, msg_cmd, timeout, processes):
    """
    测试send & recv
    """
    # 必须要将当前所在路径放进来，否则找不到
    sys.path.append(os.getcwd())

    obj = shock.ShockEcho(shock.utils.import_module_or_string(box_class),
                          concurrent, reps, url, msg_cmd, timeout, processes)
    obj.run()
    click.secho('done', fg='green')
    click.secho('Expected Transactions:     %-10d hits' % obj.expected_transactions)
    click.secho('Transactions:              %-10d hits' % obj.transactions)
    click.secho('Availability:              %-10.03f %%' % (obj.availability * 100))
    click.secho('Elapsed time:              %-10.03f secs' % obj.elapsed_time)
    click.secho('Response time:             %-10.03f secs' % obj.response_time)
    click.secho('Transaction rate:          %-10.03f trans/sec' % obj.transaction_rate)
    click.secho('Successful transactions:   %-10d hits' % obj.successful_transactions)
    click.secho('Failed transactions:       %-10d hits' % obj.failed_transactions)


@cli.command()
@click.option('--box_class', '-b', default='netkit.box.Box', help='box class')
@click.option('--concurrent', '-c', type=int, default=10, help='spawn users, 10')
@click.option('--processes', '-p', default=1, type=int, help='process count, 1')
@click.option('--url', '-u', help='url, like 127.0.0.1:7777, ws://127.0.0.1:8000/echo', required=True)
@click.option('--timeout', '-o', default=5, type=int, help='timeout, 5')
def connect(box_class, concurrent, url, timeout, processes):
    """
    测试connect
    """
    # 必须要将当前所在路径放进来，否则找不到
    sys.path.append(os.getcwd())

    obj = shock.ShockConnect(shock.utils.import_module_or_string(box_class),
                             concurrent, url, timeout, processes)
    obj.run()
    click.secho('done', fg='green')
    click.secho('Expected Transactions:     %-10d hits' % obj.expected_transactions)
    click.secho('Transactions:              %-10d hits' % obj.transactions)
    click.secho('Availability:              %-10.03f %%' % (obj.availability * 100))
    click.secho('Elapsed time:              %-10.03f secs' % obj.elapsed_time)
    click.secho('Response time:             %-10.03f secs' % obj.response_time)
    click.secho('Transaction rate:          %-10.03f trans/sec' % obj.transaction_rate)
    click.secho('Successful transactions:   %-10d hits' % obj.successful_transactions)
    click.secho('Failed transactions:       %-10d hits' % obj.failed_transactions)


if __name__ == '__main__':
    cli()
