#! /usr/bin/env python3
import sys
import argparse
import os
import re

# Parse and assign user input
parser = argparse.ArgumentParser()
parser.add_argument('command', help='parse options of specified command')
parser.add_argument('options', help='learn more about these', nargs='+')
parser.add_argument('-a', '--all', help='display all available options',
                    action='store_true')
parser.add_argument('-s', '--short', help='interpret all options as short-form',
                    action='store_true')
parser.add_argument('-l', '--long', help='interpret all options as long-form',
                    action='store_true')
parser.add_argument('-k', '--keyword', help='find option based on search word',
                    action='store_true')

args = parser.parse_args()
cmd_in = args.command
opts_in = args.options

defs_dir = '../optic/definitions'

# Check that parsed command has definition
cmd_defs = os.listdir(defs_dir)
if cmd_in not in cmd_defs:
    print(cmd_in + ' does not have a definition')
    sys.exit(0)

# Read cmd file contents
entries = []
with open(defs_dir + '/' + cmd_in, 'r') as f:
    entries = f.read().split('\n\n')

# Construct master list of cmd definitions
entries_list = []
for entry in entries:
    opts_r = entry.replace(',','').replace('=',' ').split('\n')[0].split(' ')
    opts = [x for x in opts_r if x.startswith('-')]
    altr = entry.split('\n')[0]
    for opt in opts:
        defn = ' '.join(entry.split('\n')[1:])
        if '|    ' in defn:
            defn = '\n'.join(entry.split('\n')[1:]).replace('|','')
        opt_no_dash = re.sub('^[^a-zA-Z]*|[^a-zA-Z]*$', '', opt)
        entries_list.append((opt_no_dash, altr, defn))

# Format user options for fetching
for opt_in in opts_in:
    valid_long_opt = any(entry[0] == opt_in and len(opt_in) > 1
                         for entry in entries_list)
    if valid_long_opt is False:
        index = opts_in.index(opt_in)
        opt_alph = ''.join([c for c in opt_in if c.isalpha()])
        opt_sep = ' '.join(opt_alph)
        opts_in[index] = opt_sep

opts_str = ' '.join(opts_in)
opts_in = opts_str.split()

# Fetch options in user given order
for opt_in in opts_in:
    for entry in entries_list:
        opt = entry[0]
        if opt_in == opt:
            altr = entry[1]
            defn = entry[2]
            print(altr + '\n' + defn + '\n')
            break
    else:
        print('-' + opt_in + '\ninvalid option\n')
