import json
import logging
import os
from c11_api import c11_api
from datetime import datetime


class pdf_export:
    api: c11_api
    log_dir = "C:/GlobalCube/Tasks/gctools/logs"

    def __init__(self, api):
        self.api = api
        now = datetime.now().strftime('%Y%m%d_%H%M%S')
        prot_file = f"{self.log_dir}/error_{now}.log"
        logging.basicConfig(
            filename=prot_file,
            filemode='w',
            encoding='utf-8',
            level=logging.DEBUG,
            force=True
        )

    def export_folder(self, folder='', format='PDF'):
        if not folder.startswith('Team Content'):
            folder = 'Team Content/ReportOutput/' + folder
        reports = self.api.get_reports_in_folder(folder, True)
        for r in reports:
            print(r['name'])
            self.export_report(r['id'], format, folder=folder)

    def export_report(self, report_id, format, folder=None):
        if format == 'PDF':
            return self.export_pdf(report_id, folder)
        if format == 'XML':
            return self.api.export_unstubbed(report_id)
        return False

    def export_pdf(self, report_id, folder=None):
        report = self.api.get_report(report_id)
        if 'meta' not in report:
            logging.warning(report['name'] + ' is not accessible!')
            return False
        params = {}
        if len(report['meta']['required']) > 0:
            if set(report['meta']['required'].keys()) != {'p_Von', 'p_Bis'}:
                return False
            params['p_Von'] = {'2022-10-12': '12.10.2022'}
            params['p_Bis'] = {'2022-10-12': '12.10.2022'}
            params['p_Zeitraum'] = {'Einzelne Monate': 'Einzelne Monate'}

            for k, v in report['meta']['optional'].items():
                if k in ['p_Zeit', 'p_Auswahl_Monate', 'p_12_Monate']:
                    for k1, v1 in reversed(v.items()):
                        if v1 != 'Invalid Dates':
                            params[k] = {k1: v1}
                            continue  # use last element only

        if len(report['params']) == 0:
            filename = report['filename']
            self.request_and_save_file(report['id'], params, filename)
            return True
        if len(report['params']) == 1:
            filename = report['filename'].format('1')
            self.request_and_save_file(report['id'], params, filename)

            key1 = report['params'][0]
            for k1, v1 in report['meta']['optional'][key1].items():
                filename = report['filename'].format(v1)
                params[key1] = {k1: v1}
                self.request_and_save_file(report['id'], params, filename)
            return True
        if len(report['params']) == 2:
            key1, key2 = report['params']
            for k1, v1 in report['meta']['optional'][key1].items():
                for k2, v2 in report['meta']['optional'][key2].items():
                    filename = report['filename'].format(v1, v2)
                    params[key1] = {k1: v1}
                    params[key2] = {k2: v2}
                    self.request_and_save_file(report['id'], params, filename)
            return True

    def request_and_save_file(self, report_id, params, filename):
        logging.debug(filename)
        logging.debug(params)
        status_code, content = self.api.request_file(report_id, params)
        if status_code == 200:
            os.makedirs(os.path.dirname(filename), exist_ok=True)
            with open(filename, "wb") as f:
                f.write(content)
        else:
            logging.warning(content)

    def export_errors(self):
        pdf.export_folder('Team Content', 'XML')
        reports = self.api.get_reports_in_folder('Team Content', True)
        errors = [r for r in reports if 'error' in r]
        filename = 'C:/GlobalCube/Tasks/gctools/logs/config/report_errors.json'
        os.makedirs(os.path.dirname(filename), exist_ok=True)
        json.dump(errors, open(filename, 'w'), indent=2)


if __name__ == '__main__':
    api = c11_api()
    api.login()
    pdf = pdf_export(api)
    # pdf.export_folder('Team Content/Verkauf/1. Gesamtverkauf', 'PDF')
    pdf.export_folder('Team Content/Aftersales/1. Service')
    # pdf.export_errors()