#!/usr/bin/env python3
import argparse
import sys
import os
import subprocess
import yaml

from nort.config import Config
from nort.note import Note
from nort.util import get_prefix


def edit_note(args, cfg: Config):
    file_name = args.name if '.md' == args.name[-3:] else args.name + '.md'

    path = os.path.join(cfg.notes_path, file_name)

    if not os.path.isfile(path):
        print(f'ERROR: {path} is not a valid file')
        sys.exit(1)
    subprocess.call([cfg.editor, path])


def new_note(args, cfg: Config):
    file_name = args.name if '.md' == args.name[-3:] else args.name + '.md'

    note = Note(name=args.name, content=f'# {args.name}', tags=args.tags)

    path = os.path.join(cfg.notes_path, file_name)
    with open(path, 'w+') as f:
        f.write(str(note))

    subprocess.call([cfg.editor, path])


def view_note(args, cfg: Config):
    file_name = args.name if '.md' == args.name[-3:] else args.name + '.md'

    path = os.path.join(cfg.notes_path, file_name)
    subprocess.call([cfg.viewer, path])


def list_notes(args, cfg: Config):
    notes = []
    for f in os.listdir(cfg.notes_path):
        filename, file_extension = os.path.splitext(f)
        if file_extension == '.md':
            path = os.path.join(cfg.notes_path, f)
            note = Note.from_file(path)

            if args.tags:
                if list(filter(lambda x: x in args.tags, note.tags)):
                    notes.append(note)
            else:
                notes.append(note)

    for note in notes:
        print(note.name)


def main(args=None):
    parser = argparse.ArgumentParser(description='')
    subparser = parser.add_subparsers()

    parser.set_defaults(func=lambda _, __: parser.print_help())

    parser.add_argument('--config',
                        type=str,
                        default=None,
                        help='override config path')

    parser_new = subparser.add_parser('new', help='creates a new note')
    parser_new.add_argument('name', type=str, help='name of note')
    parser_new.add_argument('--tags',
                            default=[],
                            type=str,
                            nargs='+',
                            help='adds tags to note')
    parser_new.set_defaults(func=new_note)

    parser_edit = subparser.add_parser('edit', help='edit a existing note')
    parser_edit.add_argument('name', type=str, help='name of note')
    parser_edit.set_defaults(func=edit_note)

    parser_view = subparser.add_parser('view',
                                       help='views the note in the viewer')
    parser_view.add_argument('name', type=str, help='name of note')
    parser_view.set_defaults(func=view_note)

    parser_list = subparser.add_parser('list', help='list available notes')
    parser_list.add_argument('--tags',
                             default=[],
                             type=str,
                             nargs='+',
                             help='filters by tags')
    parser_list.set_defaults(func=list_notes)

    args = parser.parse_args()

    if args.config:
        cfg_path = args.tmux_config
    elif os.path.exists(os.path.expanduser("~/.nort.yaml")):
        cfg_path = os.path.expanduser("~/.nort.yaml")
    elif os.path.exists(os.path.expanduser("~/.config/nort.yaml")):
        cfg_path = os.path.expanduser("~/.config/nort.yaml")
    else:
        prefix = get_prefix()
        cfg_path = os.path.join(prefix, 'share', 'nort', 'nort.yaml')
    cfg = Config.from_yaml(cfg_path)

    args.func(args, cfg)


if __name__ == '__main__':
    main(sys.argv)
