import time

from lbry.wallet.server import util


def sessions_lines(data):
    """A generator returning lines for a list of sessions.

    data is the return value of rpc_sessions()."""
    fmt = ('{:<6} {:<5} {:>17} {:>5} {:>5} {:>5} '
           '{:>7} {:>7} {:>7} {:>7} {:>7} {:>9} {:>21}')
    yield fmt.format('ID', 'Flags', 'Client', 'Proto',
                     'Reqs', 'Txs', 'Subs',
                     'Recv', 'Recv KB', 'Sent', 'Sent KB', 'Time', 'Peer')
    for (id_, flags, peer, client, proto, reqs, txs_sent, subs,
         recv_count, recv_size, send_count, send_size, time) in data:
        yield fmt.format(id_, flags, client, proto,
                         f'{reqs:,d}',
                         f'{txs_sent:,d}',
                         f'{subs:,d}',
                         f'{recv_count:,d}',
                         '{:,d}'.format(recv_size // 1024),
                         f'{send_count:,d}',
                         '{:,d}'.format(send_size // 1024),
                         util.formatted_time(time, sep=''), peer)


def groups_lines(data):
    """A generator returning lines for a list of groups.

    data is the return value of rpc_groups()."""

    fmt = ('{:<6} {:>9} {:>9} {:>6} {:>6} {:>8}'
           '{:>7} {:>9} {:>7} {:>9}')
    yield fmt.format('ID', 'Sessions', 'Bwidth KB', 'Reqs', 'Txs', 'Subs',
                     'Recv', 'Recv KB', 'Sent', 'Sent KB')
    for (id_, session_count, bandwidth, reqs, txs_sent, subs,
         recv_count, recv_size, send_count, send_size) in data:
        yield fmt.format(id_,
                         f'{session_count:,d}',
                         '{:,d}'.format(bandwidth // 1024),
                         f'{reqs:,d}',
                         f'{txs_sent:,d}',
                         f'{subs:,d}',
                         f'{recv_count:,d}',
                         '{:,d}'.format(recv_size // 1024),
                         f'{send_count:,d}',
                         '{:,d}'.format(send_size // 1024))


def peers_lines(data):
    """A generator returning lines for a list of peers.

    data is the return value of rpc_peers()."""
    def time_fmt(t):
        if not t:
            return 'Never'
        return util.formatted_time(now - t)

    now = time.time()
    fmt = ('{:<30} {:<6} {:>5} {:>5} {:<17} {:>4} '
           '{:>4} {:>8} {:>11} {:>11} {:>5} {:>20} {:<15}')
    yield fmt.format('Host', 'Status', 'TCP', 'SSL', 'Server', 'Min',
                     'Max', 'Pruning', 'Last Good', 'Last Try',
                     'Tries', 'Source', 'IP Address')
    for item in data:
        features = item['features']
        hostname = item['host']
        host = features['hosts'][hostname]
        yield fmt.format(hostname[:30],
                         item['status'],
                         host.get('tcp_port') or '',
                         host.get('ssl_port') or '',
                         features['server_version'] or 'unknown',
                         features['protocol_min'],
                         features['protocol_max'],
                         features['pruning'] or '',
                         time_fmt(item['last_good']),
                         time_fmt(item['last_try']),
                         item['try_count'],
                         item['source'][:20],
                         item['ip_addr'] or '')