"""
    schema: platform-specific decoded status message (DRAFT)
"""
from . import full_message_schema, api
from flask_restx import fields

gps_schema = api.model(
    "GPS",
    {
        "gps_source": fields.Float(  # TODO: TBD with partners
            required=False,
            description=(
                "Source of gps position. E.g. USBL (external),"
                + "platform itself (internal)"
            ),
            example="internal",
        ),
        "latitude_type": fields.String(
            required=False,
            description="",
            example="",
        ),
        "longitude_type": fields.String(
            required=False,
            description="",
            example="",
        ),
        "latitude": fields.Float(
            required=False,
            description="Latitude in <DEFINE UNITS>",
            example="",
        ),
        "longitude": fields.Float(
            required=False,
            description="Longitude in <DEFINE UNITS>",
            example="",
        ),
        "depth": fields.Float(
            required=False,
            description="Depth in <DEFINE UNITS>",
            example="",
        ),
        "altitude": fields.Float(
            required=False,
            description="Altitude in <DEFINE UNITS>",
            example="",
        ),
        # "gps_fix_seconds_ago"
    },
)

sensor_schema = api.model(
    "SensorSchema",
    {
        "sensor_ID": fields.Integer(
            required=True,
            description="unique identifier for platform",
            example=2,
        ),
        "serial": fields.String(
            required=False,
            description="serial number of sensor",
            example="mbes-001",
        ),
        "sensor_status": fields.Boolean(
            required=False,
            description="Sensor switched on (True) or off (False)",
            example=True,
        ),
        "additional_data": fields.Raw(
            required=False,
            description="Any addition fields/data to be added here",
        ),
    },
)


platform_status_message_schema = api.model(
    "platformStatusMessage",
    {
        "message": fields.Nested(
            full_message_schema,
            required=True,
            description="Message header",
        ),
        "platform_ID": fields.Integer(
            required=True,
            description="unique identifier for platform",
            example=1,
        ),
        "active": fields.Boolean(
            required=False,
            description="When a platform is in deployment (executing a"
            + " mission plan) this should be True",
            example=True,
        ),
        "platform_state": fields.String(
            # TODO: Define dictionary with potential STATES of each platform
            required=False,
            description="Current state executed by platform. E.g. "
            + "STOP, IDLE, ABORT.",
            example="IDLE",
        ),
        "autonomy_plan_ID": fields.Integer(
            required=False,
            description="Last mission plan ID (according to Autonomy Engine's"
            + " mission plan number) executed by platform",
            example=1,
        ),
        "mission_track_ID": fields.Integer(
            required=False,
            description=(
                "Track number - stage in mission (e.g. "
                + "4 --> Waypoint 3 to Waypoint 4)"
            ),
            example=4,
        ),
        "mission_action_ID": fields.Integer(
            required=False,
            description="to add description",
            example=1,
        ),
        "range_to_go": fields.Float(
            required=False,
            description="Estimated distance to reach next waypoint",
            example=124.3,
        ),
        "speed_over_ground": fields.Float(
            required=False,
            description="",
            example=124.3,
        ),
        "water_current_velocity": fields.Float(
            required=False,
            description="",
            example=124.3,
        ),
        "thrust_applied": fields.Float(
            required=False,
            description="TODO: Needs further consideration",
            example=124.3,
        ),
        "health_status": fields.String(
            required=False,
            description="Health status extracted by respective platform "
            + "if any diagnosis available checks on sensors",
            example="Warning",
        ),
        "gps_data": fields.List(
            fields.Nested(gps_schema),  # TODO: TBD Do we want a list of
            # gps readings to allow > 1 reading i.e. platform + usbl
            required=True,
            description="Metadata pf each platform",
        ),
        "localisation_error": fields.Float(
            required=False,
            description="Localisation error at last USBL update.",
            example="",
        ),
        "usbl_fix_seconds_ago": fields.Float(
            required=False,
            description="",
            example="",
        ),
        "battery_remaining_capacity": fields.Float(
            required=True,
            description="Battery remaining capacity % provided by respective"
            + " platform/C2.",
            example=80.0,
        ),
        "sensor_config": fields.Nested(
            sensor_schema
        ),  # TODO: TBD Do we want a list of sensors to allow > 1 sensor
    },
)

# TBD: Do we append beacon positions with platform positions?