#!/usr/bin/python3

import configparser
import argparse
import os

#---------------------------------------------------------------------------

def config_load(filename):
    with open(filename) as configfile:
          config.read_file(configfile)

def config_save(filename):
    with open(filename, 'w') as configfile:
          config.write(configfile)

#---------------------------------------------------------------------------

configfile_name = os.path.expanduser('~/.config/cdk.ini')

config = configparser.ConfigParser()

try:
    config_load(configfile_name)
except:
    os.mkdir(os.path.expanduser('~/.config'), mode = 0o700)
    config['defaults'] = {
            'cdk': os.path.expanduser('~/compiladores/root'), 
            'system': 'no' 
    }
    config['cvs'] = {'CVSROOT':'none'}

config_save(configfile_name)

#---------------------------------------------------------------------------
#mk-node-decls.pl  mk-visitor-decls.pl  mk-visitor-skel.pl

def cdk_do_ast_cdk(config, args):
    whereami = os.path.dirname(os.path.realpath(__file__))
    for decl in args.decls:
        if decl == 'ast':
            #print(f"running {whereami}/mk-node-decls.pl cdk ooo")
            os.system(f"{whereami}/mk-node-decls.pl cdk")
        else:
            #print(f"running {whereami}/mk-visitor-decls.pl cdk")
            os.system(f"{whereami}/mk-visitor-decls.pl cdk")

def cdk_do_ast_language(config, args):
    whereami = os.path.dirname(os.path.realpath(__file__))
    for decl in args.decls:
        if decl == 'ast':
            #print(f"running {whereami}/mk-node-decls.pl {args.language}")
            os.system(f"{whereami}/mk-node-decls.pl {args.language}")
        else:
            #print(f"running {whereami}/mk-visitor-decls.pl {args.language}")
            os.system(f"{whereami}/mk-visitor-decls.pl {args.language}")

def cdk_do_target(config, args):
    whereami = os.path.dirname(os.path.realpath(__file__))
    for target in args.target:
        #print(f"running {whereami}/mk-visitor-skel.pl {args.language} {target}")
        os.system(f"{whereami}/mk-visitor-skel.pl {args.language} {target}")

#---------------------------------------------------------------------------

parser = argparse.ArgumentParser(prog="cdk", description='CDK command line interface.')

subparsers = parser.add_subparsers(help='CDK sub-commands.', dest="subcommand")

# create the parser for the "ast" command
parser_ast = subparsers.add_parser('ast', help='AST commands.')

required_a = parser_ast.add_argument_group('required arguments')
required_a.add_argument('--decls', action='append', choices=['ast', 'target'], help='generate declarations (multiple choice).', required=True)
group_ast = required_a.add_mutually_exclusive_group(required=True)
group_ast.add_argument('--cdk',      dest='in_cdk',   action='store_true', help="generate code for the CDK")
group_ast.add_argument('--language', dest='language', action='store',      help="generate code for given language")

# create the parser for the "target" command
parser_t = subparsers.add_parser('target', help='Generation target (visitor) commands.')
required_t = parser_t.add_argument_group('required arguments')
required_t.add_argument('--language', type=str, dest='language', action="store", help='Check LANGUAGE target', required=True)
required_t.add_argument('--target', type=str, dest='target', action="append", help='Which TARGET(s) to check (may be repeated)', required=True)

#---------------------------------------------------------------------------
### DO THINGS

args = parser.parse_args()

if args.subcommand == 'ast':
    if args.in_cdk:
        cdk_do_ast_cdk(config, args)
    else:
        cdk_do_ast_language(config, args)
elif args.subcommand == 'target':
    cdk_do_target(config, args)
else:
    parser.print_help()

