#!/usr/bin/env python3

import argparse
import datetime
import html
import json
import re
import subprocess
import sys
import typing as t

import requests

ANSWERS_URL = "https://anon.fm/answers.js"


class Colors:
    BLUE = "\033[94m"
    GREEN = "\033[92m"
    RED = "\033[91m"
    RESET = "\033[m"

    @classmethod
    def disable(cls):
        cls.BLUE = ""
        cls.GREEN = ""
        cls.RED = ""
        cls.RESET = ""


def strip_html(s: str) -> str:
    return html.unescape(re.sub(r"<[^<]+?>", "", s.replace("<br>", "\n")))


def parse_answer(answer: t.Tuple[str, str, str, str, str, str], width: int, separator: t.Optional[str] = None) -> str:
    listener = answer[1]
    message = strip_html(answer[2])
    timestamp = re.search(r"(?:[0-9]{2}:){2}[0-9]{2}", answer[3]).group()
    response = strip_html(answer[5])
    response, dj = re.split(r"\n\nС уважением, ", response)

    result = ""
    if separator:
        result = f"\n{separator * int(width / len(separator))}\n\n"
    result += f"{Colors.BLUE}{timestamp}{Colors.RESET}\n"

    if listener == "!":
        return (
            result +
            f"{Colors.GREEN}{dj}{Colors.RESET} => {Colors.RED}слушатели{Colors.RESET}:\n"
            f"{response}"
        )
    return (
        result +
        f"{Colors.RED}{listener}{Colors.RESET} => {Colors.GREEN}диджейка{Colors.RESET}:\n"
        f"{message}\n\n"
        f"{Colors.GREEN}{dj}{Colors.RESET} => {Colors.RED}{listener}{Colors.RESET}:\n"
        f"{response}"
    )


def parse_args() -> argparse.Namespace:
    parser = argparse.ArgumentParser()
    parser.add_argument("--no-colors", "-c", action="store_true")
    parser.add_argument("--separator", "-s", default="—")
    parser.add_argument("--tail", "-t", help="amount of last messages to display", type=int)
    parser.add_argument("--width", "-w", help="separator line width", type=int)
    return parser.parse_args()



def main() -> None:
    args = parse_args()

    if args.no_colors:
        Colors.disable()

    if args.width:
        width = args.width
    else:
        _, width = [int(i) for i in subprocess.check_output(["stty", "size"], encoding="utf-8").split()]

    answers = [tuple(i) for i in json.loads(requests.get(ANSWERS_URL).content)]

    separator = ""
    for answer in reversed(answers[:args.tail]):
        print(parse_answer(answer, width, separator))
        separator = args.separator


if __name__ == "__main__":
    main()
