#!/usr/bin/env python3

import os
import sys
import argparse

from markdown_contents_generator.behaviours import (
    print_contents,
    update_file,
)
from markdown_contents_generator.contents_builder import ContentsBuilder
from markdown_contents_generator.contents_parser import ContentsParser


class ArgumentParser(argparse.ArgumentParser):

    def error(self, message):
        sys.stderr.write(f"error: {message}\n")
        self.print_help()
        sys.exit(2)


def main():
    parser = ArgumentParser(
        description="Generate contents for markdown files (*.md).",
        formatter_class=argparse.ArgumentDefaultsHelpFormatter
    )
    parser.add_argument(
        dest="path",
        metavar="MARKDOWN_FILEPATH",
        help="Path to markdown file"
    )
    parser.add_argument(
        "-l", "--lower-level",
        metavar="LEVEL",
        type=int,
        default=4,
        help="Lower header level (default: %(default)s)"
    )
    parser.add_argument(
        "-g", "--higher-level",
        metavar="LEVEL",
        type=int,
        default=2,
        help="Higher header level (default: %(default)s)"
    )
    parser.add_argument(
        "-m", "--margin",
        metavar="MARGIN",
        type=str,
        default="    ",
        help="Margin string (default: \"%(default)s\" [FOUR SPACES])"
    )
    parser.add_argument(
        "-p", "--prefix",
        metavar="PREFIX",
        type=str,
        default="- ",
        help="After margin prefix string "
             "(default: \"%(default)s\" [DASH+SPACE])"
    )
    parser.add_argument(
        "-i", "--insert",
        action="store_true",
        help="Insert contents into the file"
    )
    parser.add_argument(
        "--replace-tags",
        action="store_true",
        help="Remove contents tags from the target file "
             "(when inserting into a file)"
    )
    parser.add_argument(
        "--force-margin", "--save-margin",
        action="store_true",
        help="Save margin for items level (if higher level isn't 1)"
    )
    parser.add_argument(
        "--debug",
        action="store_true",
        help="Run in debug mode"
    )

    args = parser.parse_args()

    if not os.path.exists(args.path):
        sys.stdout.write(f"{args.path} does not exist\n")
        sys.stdout.flush()

        return 1

    if not os.path.isfile(args.path):
        sys.stdout.write(f"{args.path} is not a file.\n")
        sys.stdout.flush()

        return 1

    contents_parser = ContentsParser(
        target_file=args.path
    )
    contents_builder = ContentsBuilder(
        contents_parser=contents_parser,
        margin=args.margin,
        prefix=args.prefix,
        higher=args.higher_level,
        lower=args.lower_level,
        save_margin=args.force_margin
    )

    try:
        if not args.insert:
            print_contents(contents_builder)
        else:
            inserted_count = update_file(
                contents_builder=contents_builder,
                target_file=args.path,
                replace_tags=args.replace_tags
            )

            if inserted_count == 0:
                sys.stdout.write("No contents tags found\n")
            else:
                sys.stdout.write(
                    f"Contents updated ({inserted_count} found)\n"
                )

            sys.stderr.flush()
    except Exception as e:
        if args.debug and 0:  # Disabled feature
            from traceback import format_exc

            sys.stderr.write(f"{format_exc()}\n")
            sys.stderr.flush()
        else:
            sys.stderr.write(f"{e}\n")
            sys.stderr.flush()

        return 1

    return 0


if __name__ == "__main__":
    sys.exit(main())
