#!/usr/local/bin/python3.13
"""
A simple script to parse and output logs from a poezio logfile
"""

from poezio.logger import LogInfo, LogMessage, parse_log_line
from functools import singledispatch
from poezio import poopt
import argparse
import datetime
import sys

INFO_COLOR = '\033[35;2m'
NICK_COLOR = '\033[36;2m'
NO_COLOR = '\033[0m'
TIME_COLOR = '\033[33;2m'

SHOW_INFO = True
SHOW_TIME = True

@singledispatch
def print_log(log_object, additional_lines=None):
    time = log_object.time.strftime('%Y-%m-%d %H:%M:%S')

    nick = log_object.nick
    offset = ((poopt.wcswidth(time) +1) if SHOW_TIME else 0) + 2 + poopt.wcswidth(nick)
    pad = ' ' * offset

    if additional_lines:
        more = ''.join([(pad + line) for line in additional_lines])
    else:
        more = ''

    if SHOW_TIME:
        print(('%s%s%s %s%s%s> %s\n' % (TIME_COLOR, time, NO_COLOR, NICK_COLOR, nick, NO_COLOR, log_object.text)) + more, end='')
    else:
        print(('%s%s%s> %s\n' % (NICK_COLOR, nick, NO_COLOR, log_object.text)) + more, end='')

@print_log.register(type(None))
def _(log_object, additional_lines=None):
    return

@print_log.register(LogInfo)
def _(log_object, additional_lines=None):
    if not SHOW_INFO: return
    time = log_object.time.strftime('%Y-%m-%d %H:%M:%S') + ' '

    offset = (poopt.wcswidth(time) + 1) if SHOW_TIME else 0
    pad = ' ' * offset

    if additional_lines:
        more = ''.join([(pad + line) for line in additional_lines])
    else:
        more = ''

    if SHOW_TIME:
        print(('%s%s%s %s%s\n' % (TIME_COLOR, time, NO_COLOR, INFO_COLOR, log_object.text)) + more, end='')
    else:
        print(('%s%s\n' % (INFO_COLOR, log_object.text)) + more, end='')

def parse_messages(fd):
    in_text = False
    more_lines = []
    current_log = None
    for line in fd:
        if in_text and not line.startswith(' '):
            print_log(current_log, more_lines)
            more_lines = []
            in_text = False
            current_log = None
        elif in_text:
            more_lines.append(line[1:])
            continue
        current_log = parse_log_line(line)
        in_text = True
    print_log(current_log, more_lines)

if __name__ == '__main__':
    parser = argparse.ArgumentParser('poezio_logs', description="""
Show the logs stored in poezio format in a more human-readable way.
""")
    parser.add_argument('-i', '--hide-info', dest='hide_info',
                        action='store_true', default=False,
                        help='Hide info lines')
    parser.add_argument('-t', '--hide-time', dest='hide_time',
                        action='store_true', default=False,
                        help='Hide timestamps')
    parser.add_argument('-c', '--no-color', dest='no_color',
                        action='store_true', default=False,
                        help='Remove color')
    parser.add_argument('log_file', type=argparse.FileType('r'))
    result = parser.parse_args()
    SHOW_INFO = not result.hide_info
    SHOW_TIME = not result.hide_time
    if result.no_color:
        INFO_COLOR = ''
        NICK_COLOR = ''
        NO_COLOR = ''
        TIME_COLOR = ''

    parse_messages(result.log_file)
