import datetime
import json

from celilo.reporting.StreamReportGenerator import StreamReportGenerator
from celilo.reporting.TransmissionReport import generate_transmission_report_html
from celilo.reporting.message_transmission_report import MessageTransmissionReport


class PayloadTraceReport:
    """
    PayloadTraceReport is a class that generates a report of the payload trace.
    It contains methods to generate the report and save it to a file.
    """

    def __init__(self, current_time, duration_minutes, app_package, workspace_id, config_path):
        """
        Initialize the PayloadTraceReport class.

        Args:
            current_time (str): The current time in string format.
            duration_minutes (float): The duration of the test in minutes.
            app_package (str): The package name of the app to test.
            workspace_id (str): The workspace ID to use for the test.
            config_path (str): The path to the configuration file.
        """
        self.current_time = current_time
        self.duration_minutes = duration_minutes
        self.app_package = app_package
        self.workspace_id = workspace_id
        self.config_path = config_path

    def generate_report(self):
        """
        Generate the report of the payload trace.
        """
        print(f"Stream test complete at {datetime.datetime.now()}")
        print("Generating ATAK Stream Report")
        report = MessageTransmissionReport(self.app_package, self.workspace_id)
        report = report.run(self.current_time)

        generate_transmission_report_html(json_string=json.dumps(report, cls=SetEncoder))

        print("Generating Payload Trace Report")
        report_generator = StreamReportGenerator(self.current_time, self.duration_minutes, package=self.app_package)
        latency_reports = report_generator.collect_latency_reports()
        report_generator.generate_html()

        # Merge report and latency reports into one JSON object
        merged_report = {
            "transmission_report": report,
            "latency_reports": latency_reports
        }

        print("Merged Report JSON:")
        print(json.dumps(merged_report, indent=4, cls=SetEncoder))

        pass

class SetEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, set):
            return list(obj)
        return json.JSONEncoder.default(self, obj)

# main
if __name__ == "__main__":
    current_time = "2025-12-10 12:49:45"
    duration_minutes = 1
    app_package = "com.somewearlabs.atak.debug"
    workspace_id = "39754"
    config_path = "config_sat.json"

    payload_trace_report = PayloadTraceReport(current_time, duration_minutes, app_package, workspace_id, config_path)
    payload_trace_report.generate_report()
