# -*- coding: utf-8 -*-
"""
@file   tmp1075.py
@brief  TMP1075 tests
@author J. Meier
@date   06.01.2021
"""
import enum

from eive_tmtc.config.definitions import CustomServiceList
from spacepackets.ecss.tc import PusTelecommand
from tmtccmd.config.tmtc import (
    tmtc_definitions_provider,
    TmtcDefinitionWrapper,
    OpCodeEntry,
)
from tmtccmd.tc import DefaultPusQueueHelper
from tmtccmd.tc.pus_200_fsfw_mode import Mode, pack_mode_data
from tmtccmd.tc.pus_3_fsfw_hk import create_request_one_hk_command, make_sid
from tmtccmd.util import ObjectIdU32


class OpCode:
    OFF = "off"
    ON = "on"
    NML = "nml"
    HK = "hk"


class Info:
    OFF = "Off"
    ON = "On"
    NML = "Normal"
    HK = "HK"


class Tmp1075ActionId(enum.IntEnum):
    GET_TEMP = 1
    START_ADC_CONV = 2


class SetId(enum.IntEnum):
    TEMPERATURE = 1


def pack_tmp1075_test_into(
    object_id: ObjectIdU32, op_code: str, q: DefaultPusQueueHelper
):
    q.add_log_cmd(
        f"Testing Tmp1075 Temperature Sensor Handler with object id: {object_id}"
    )
    obyt = object_id.as_bytes
    if op_code == OpCode.OFF:
        q.add_log_cmd("TMP1075: Set Normal Off")
        mode_data = pack_mode_data(obyt, Mode.OFF, 0)
        q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=mode_data))
    if op_code == OpCode.NML:
        q.add_log_cmd("TMP1075: Set Mode Normal")
        mode_data = pack_mode_data(obyt, Mode.NORMAL, 0)
        q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=mode_data))
    if op_code == OpCode.ON:
        q.add_log_cmd("TMP1075: Set Mode On")
        mode_data = pack_mode_data(obyt, Mode.ON, 0)
        q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=mode_data))
    if op_code == OpCode.HK:
        q.add_log_cmd("TMP1075: Request One-Shot HK")
        q.add_pus_tc(create_request_one_hk_command(make_sid(obyt, SetId.TEMPERATURE)))
    return q


@tmtc_definitions_provider
def add_tmp_sens_cmds(defs: TmtcDefinitionWrapper):
    oce = OpCodeEntry()
    oce.add(OpCode.OFF, Info.OFF)
    oce.add(OpCode.ON, Info.ON)
    oce.add(OpCode.NML, Info.NML)
    oce.add(OpCode.HK, Info.HK)
    defs.add_service(CustomServiceList.TMP1075.value, "TMP1075 Temperature Sensor", oce)