import argparse
import sys

from rich_rst import RestructuredText
from rich.terminal_theme import TerminalTheme

parser = argparse.ArgumentParser(description="Render reStructuredText to the console with rich-rst")
parser.add_argument(
    "path",
    metavar="PATH",
    help="path to file, or - for stdin",
)
parser.add_argument(
    "-c",
    "--force-color",
    dest="force_color",
    action="store_true",
    default=None,
    help="force color for non-terminals",
)
parser.add_argument(
    "-e",
    "--encoding",
    dest="encoding",
    type=str,
    default="utf-8",
    help="encoding for file (default: utf-8)",
)
parser.add_argument(
    "-w",
    "--width",
    type=int,
    dest="width",
    default=None,
    help="width of output (default will auto-detect)",
)
parser.add_argument(
    "-hw",
    "--html-width",
    type=str,
    dest="html_width",
    default="1675px",
    help="width of html output (default: 1675px)",
)
parser.add_argument(
    "-t",
    "--code-theme",
    dest="code_theme",
    type=str,
    default="monokai",
    help="pygments code theme",
)
parser.add_argument(
    "-html",
    "--save-html",
    type=str,
    dest="html_filename",
    default=False,
    help="save to html",
)
parser.add_argument(
    "-r",
    "--wrap",
    dest="word_wrap",
    action="store_true",
    default=False,
    help="word wrap long lines",
)
parser.add_argument(
    "-s",
    "--soft-wrap",
    action="store_true",
    dest="soft_wrap",
    default=False,
    help="enable soft wrapping mode",
)
parser.add_argument(
    "-gl",
    "--guess-lexer",
    action="store_true",
    dest="guess_lexer",
    default=False,
    help="Whether to guess the lexer for code blocks without specified language",
)
parser.add_argument(
    "-dl",
    "--default-lexer",
    type=str,
    dest="default_lexer",
    default="python",
    help="The default lexer for code blocks without specified language if no lexer could be guessed or found",
)
parser.add_argument(
    "-he",
    "--hide-errors",
    action="store_true",
    dest="hide_errors",
    default=False,
    help="Whether to hide errors or not",
)
args = parser.parse_args()

rgb = lambda r, g, b: (r, g, b)

DRACULA_TERMINAL_THEME = TerminalTheme(
    rgb(40, 42, 54),
    rgb(248, 248, 242),
    [
        rgb(40, 42, 54),
        rgb(255, 85, 85),
        rgb(80, 250, 123),
        rgb(241, 250, 140),
        rgb(189, 147, 249),
        rgb(255, 121, 198),
        rgb(139, 233, 253),
        rgb(255, 255, 255),
    ],
    [
        rgb(40, 42, 54),
        rgb(255, 85, 85),
        rgb(80, 250, 123),
        rgb(241, 250, 140),
        rgb(189, 147, 249),
        rgb(255, 121, 198),
        rgb(139, 233, 253),
        rgb(255, 255, 255),
    ],
)

CONSOLE_HTML_FORMAT = """\
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<style>
{stylesheet}
body {{
    color: {foreground};
    background-color: {background};
    max-width: """+args.html_width+"""
}}
pre {{
    white-space: pre-wrap;       /* Since CSS 2.1 */
    white-space: -moz-pre-wrap;  /* Mozilla, since 1999 */
    white-space: -pre-wrap;      /* Opera 4-6 */
    white-space: -o-pre-wrap;    /* Opera 7 */
    word-wrap: break-word;       /* Internet Explorer 5.5+ */
}}
::-moz-selection {{ /* Code for Firefox */
  background: #44475a;
}}

::selection {{
  background: #44475a;
}}

</style>
</head>
<html>
<body>
    <code>
        <pre style="font-family:ui-monospace,'Fira Code',Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace">{code}</pre>
    </code>
</body>
</html>
"""


from rich.console import Console

console = Console(force_terminal=args.force_color, width=args.width, record=bool(args.html_filename))

if args.path == "-":
    code = sys.stdin.read()
else:
    with open(args.path, "rt", encoding=args.encoding) as code_file:
        code = code_file.read()
rst = RestructuredText(
    code,
    code_theme=args.code_theme,
    guess_lexer=args.guess_lexer,
    default_lexer=args.default_lexer,
    show_errors=not args.hide_errors,
    filename=args.path if args.path != "-" else "<stdin>",
)
console.print(rst, soft_wrap=args.soft_wrap)

if args.html_filename:
    console.save_html(args.html_filename, theme=DRACULA_TERMINAL_THEME, code_format=CONSOLE_HTML_FORMAT)
