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

from threat_modeling.project import ThreatModel
from threat_modeling.enumeration.stride import NaiveSTRIDE


SUPPORTED_THREAT_GEN = {
    'stride': NaiveSTRIDE
}

parser = argparse.ArgumentParser()
parser.add_argument("--check", help="lint/check your threat model definition", action="store_true")
parser.add_argument("--attack-trees", help="generate attack trees", action="store_true")
parser.add_argument("--dfd", help="generate data flow diagram", action="store_true")
parser.add_argument("--generate-threats", help="generate threats", action="store_true")
parser.add_argument("input", help="system specification (yaml)")
args = parser.parse_args()

print('[⏳] Loading threat model, standby...')
tm = ThreatModel.load(args.input)
if args.attack_trees:
    tm.draw_attack_trees()
    print('[✅] Attack trees generated. Saved in cwd')
    sys.exit(0)
elif args.dfd:
    tm.draw()
    print('[✅] DFD drawn! Saved in dfd.png')
    sys.exit(0)
elif args.generate_threats:
    method = NaiveSTRIDE()
    new_threats = tm.generate_threats(method)
    if new_threats:
        output_yaml = os.path.splitext(args.input)[0] + '_generated.yaml'
        tm.save(output_yaml)
        print(f'[🔪] New threats found! Saved in {output_yaml}.')
    else:
        print('[✅] No new threats found.')
    sys.exit(0)
elif args.check:
    _, passed = tm.check()
    if passed:
        print('[✅] No issues found in threat model definition.')
        sys.exit(0)
    else:
        print('[🔪] Issues to address in threat model definition.')
        sys.exit(1)

else:
    print('[!] Please specify an operation on this threat model. See --help for possible options.')
    sys.exit(1)
