# -*- coding: utf-8 -*-
"""
@file   obsw_tc_service3.py
@brief  PUS Service 3:  Housekeeping Service.
@author R. Mueller
@date   02.05.2020
"""
import struct
from typing import Deque
from tmtc_core.tc.obsw_pus_tc_base import PusTelecommand
import config.obsw_config as g


def make_sid(object_id: bytearray, set_id: int) -> bytearray:
    set_id_bytearray = struct.pack(">I", set_id)
    return object_id + set_id_bytearray


def make_interval(interval_seconds: float) -> bytearray:
    return bytearray(struct.pack(">f", interval_seconds))


# adding custom defintion to hk using test pool variables
sid_thermalsensor = make_sid(g.THERMAL_SENSOR_DEVICE_ID, 1)
number_of_parameters = struct.pack('>B', 5)

sid_internal_err_rprtr = make_sid(g.INTERNAL_ERROR_REPORTER_ID, 0)


def pack_service3_test_into(tc_queue: Deque) -> Deque:
    tc_queue.appendleft(("print", "Testing Service 3"))
    # Predefined packet testing
    pack_test_device_test(tc_queue)
    pack_custom_tests(tc_queue)
    pack_internal_error_reporter_tests(tc_queue)
    tc_queue.appendleft(("export", "log/tmtc_log_service3.txt"))
    return tc_queue


def pack_test_device_test(tc_queue: Deque):
    pass


def pack_custom_tests(tc_queue: Deque):
    tc_queue.appendleft(("print", "Generate one thermal sensor packet: "))
    command = PusTelecommand(service=3, subservice=27, ssc=3100, app_data=sid_thermalsensor)
    tc_queue.appendleft(command.pack_command_tuple())

    tc_queue.appendleft(("print", "Enabling periodic thermal sensor packet generation: "))
    command = PusTelecommand(service=3, subservice=5, ssc=3101, app_data=sid_thermalsensor)
    tc_queue.appendleft(command.pack_command_tuple())

    tc_queue.appendleft(("wait", 4))

    new_interval = 1.2
    interval_app_data = sid_thermalsensor + make_interval(new_interval)
    tc_queue.appendleft(("print", "Setting interval to 1.2 second: "))
    command = PusTelecommand(service=3, subservice=31, ssc=3102, app_data=interval_app_data)
    tc_queue.appendleft(command.pack_command_tuple())

    tc_queue.appendleft(("wait", 3))

    tc_queue.appendleft(("print", "Disabling periodic thermal sensor packet generation: "))
    command = PusTelecommand(service=3, subservice=6, ssc=3103, app_data=sid_thermalsensor)
    tc_queue.appendleft(command.pack_command_tuple())

    tc_queue.appendleft(("print", "Generating structure report for thermal sensor packet: "))
    command = PusTelecommand(service=3, subservice=9, ssc=3104, app_data=sid_thermalsensor)
    tc_queue.appendleft(command.pack_command_tuple())


def pack_internal_error_reporter_tests(tc_queue: Deque):
    tc_queue.appendleft(("print", "Testing internal error reporter (diagnostic): "))
    new_interval = 3.0
    interval_app_data = sid_internal_err_rprtr + make_interval(new_interval)
    tc_queue.appendleft(("print", "Setting internal error reporter interval to 3.0 second: "))
    command = PusTelecommand(service=3, subservice=32, ssc=3105, app_data=interval_app_data)
    tc_queue.appendleft(command.pack_command_tuple())

    tc_queue.appendleft(("print", "Enabling internal error reporter generation: "))
    command = PusTelecommand(service=3, subservice=7, ssc=3106, app_data=sid_internal_err_rprtr)
    tc_queue.appendleft(command.pack_command_tuple())

    tc_queue.appendleft(("wait", 3))

    tc_queue.appendleft(("print", "Disabling internal error reporter generation: "))
    command = PusTelecommand(service=3, subservice=8, ssc=3107, app_data=sid_internal_err_rprtr)
    tc_queue.appendleft(command.pack_command_tuple())

    tc_queue.appendleft(("print", "Generate one shot internal error report: "))
    command = PusTelecommand(service=3, subservice=28, ssc=3108, app_data=sid_internal_err_rprtr)
    tc_queue.appendleft(command.pack_command_tuple())

    tc_queue.appendleft(("print", "Generate structure report: "))
    command = PusTelecommand(service=3, subservice=11, ssc=3109, app_data=sid_internal_err_rprtr)
    tc_queue.appendleft(command.pack_command_tuple())

    tc_queue.appendleft(("print", "Enabling internal error reporter generation: "))
    command = PusTelecommand(service=3, subservice=7, ssc=3106, app_data=sid_internal_err_rprtr)
    tc_queue.appendleft(command.pack_command_tuple())

    new_interval = 8.0
    interval_app_data = sid_internal_err_rprtr + make_interval(new_interval)
    tc_queue.appendleft(("print", "Setting internal error reporter interval to 8.0 second: "))
    command = PusTelecommand(service=3, subservice=32, ssc=3107, app_data=interval_app_data)
    tc_queue.appendleft(command.pack_command_tuple())

    tc_queue.appendleft(("print", "Generate structure report: "))
    command = PusTelecommand(service=3, subservice=11, ssc=3110, app_data=sid_internal_err_rprtr)
    tc_queue.appendleft(command.pack_command_tuple())

    tc_queue.appendleft(("print", "Disabling internal error reporter generation: "))
    command = PusTelecommand(service=3, subservice=8, ssc=3111, app_data=sid_internal_err_rprtr)
    tc_queue.appendleft(command.pack_command_tuple())