#!/usr/bin/python3
# @ingroup freda_ttbox
# @copyright
#   SPDX-FileCopyrightText: 2026 European Southern Observatory (ESO)
#   SPDX-License-Identifier: LGPL-3.0-only
#
# @brief main file of a freda emulator

"""
@file
@author Christophe Moins <cmoins@eso.org>


The freda emulator emulates a ttox freda camera facility by handling input 
commands coming from freda ccf and by sending rtms data based on an input file.
"""
import asyncio
import signal
import sys

from elt.log import CiiLogManager
from freda.emulator.fake_cam import CameraEmulator
from freda.emulator.freda_servers import TTBoxEmulator


def signal_handler():
    # cancel all tasks
    for task in asyncio.all_tasks():
        task.cancel()


async def main():
    """
    @brief Main function of the freda emulator

    Starts the freda emulator 

    Args:
       config: freda configuration file (-c option)
       log: logging configuration file (-l option)
    @ingroup emulator
    """

    import argparse
    parser = argparse.ArgumentParser(description="Freda-ttbox emulator")
    parser.add_argument("-c", "--config", help="configuration file")
    parser.add_argument("-k", "--packetsenddelay", help="delay between two mudpi packet in microsec")
    parser.add_argument("-l", "--log", help="logging configuration file")

    DEFAULT_PACKET_DELAY_IN_MICROSEC = 10
    args = parser.parse_args()
    if args.log:
        CiiLogManager.configure(args.log)
    packet_send_delay = args.packetsenddelay if args.packetsenddelay else DEFAULT_PACKET_DELAY_IN_MICROSEC
    freda_emulator = TTBoxEmulator(args.config)
    fake_camera = CameraEmulator(args.config, packet_send_delay )
    loop = asyncio.get_event_loop()    
    loop.add_signal_handler(signal.SIGINT,  signal_handler)                            

    try:
        await asyncio.gather(freda_emulator.run(), fake_camera.run())
    except asyncio.CancelledError:
        print("Exiting")


if __name__ == "__main__":
    asyncio.run(main())
