import json
import os
import logging
from jinja2 import Environment, PackageLoader
from tinydb import TinyDB, Query

logging.basicConfig(filename="log.txt")
env = Environment(loader=PackageLoader('assets', 'templates'), extensions=['jinja2.ext.do'])

def pretty_print(dict):
    try:
        return json.dumps(dict, sort_keys=True, indent=4, separators=(',', ': '))
    except:
        return dict

env.filters['pretty_print'] = pretty_print

def generate_cross_project_page(header, fields, dropdowns, findings, rule_title):
    template = env.get_template("finding_template.html")
    output_dir = "Report Output/cross-project/rules/"
    if not os.path.isdir(output_dir):
        try:
            os.makedirs(output_dir)
        except Exception as e:
            msg = "could not make output directory '%s'. The error encountered was: %s%s%sStack trace:%s%s" % (output_dir, e, os.linesep, os.linesep, os.linesep, traceback.format_exc())
            print("Error: %s" % (msg))
            logging.exception(msg)

    file = open("Report Output/cross-project/rules/" + rule_title + ".html", "w+")
    file.write(template.render(
        **{"records": findings, "dropdowns": dropdowns, "header": header, "fields": fields,
            "text": rule_title}))
    file.close()

rules = ["Primitive Roles in Use","Bucket Logging Not Enabled"] #change to any list of rules
def x_project_findings(rules):
    db = TinyDB("projects.json")
    project_list = []
    for project in db.table("Project").all():
        project_list.append(project['projectId'])

    for rule_title in rules:
        findings = []
        entity = {}
        for projectId in project_list:
            project_db = TinyDB("project_dbs/" + projectId + ".json")
            res = project_db.table("Rule").get(Query().title == rule_title)
            for finding in project_db.table("Finding").all():
                if finding['rule']['id'] == res.eid:
                    entity = project_db.table(finding['entity']['table']).get(doc_id = finding['entity']['id'])
                    entity['projectId'] = projectId
                    findings.append(entity)
        generate_cross_project_page("", entity.keys(), {}, findings, rule_title)
x_project_findings(rules)
# This is just to get numbers of resources
# for projectId in project_list:
#     project_db = TinyDB("project_dbs/" + projectId + ".json")
#     print(len(project_db.table("Bucket").all()))