"""
    schema: vehicle-specific decoded status message (DRAFT)
"""
from . import message_header_schema, vehicle_schema, api
from flask_restx import fields

# TODO: Discuss nomenclature > vehicle or vehicle?

gps_schema = api.model(
    "GPS",
    {
        "gps_source": fields.Float(  # TODO: TBD with partners
            required=False,
            description="Source of gps position. E.g. USBL (external), vehicle 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": fields.Float(
        #     required=False,
        #     description="",
        #     example="",
        # ),
    },
)

# battery_schema = api.model(
#     "Battery",
#     {
#         "voltage_v": fields.Float(
#             required=True,
#             description="Volts",
#             example=23.0,
#         ),
#         "current_amps": fields.Float(
#             required=False,
#             description="Amps",
#             example=1.2,
#         ),
#         "current_usage_amphours": fields.Float(
#             required=False,
#             description="Amp-Hours",
#             example=1.2,
#         ),
#         "wattage_w": fields.Float(
#             required=False,
#             description="Watts",
#             example=23.0,
#         ),
#         "wattage_usage_watthours": fields.Float(
#             required=False,
#             description="Watt-Hours",
#             example=23.0,
#         ),
#         "remaining_capacity": fields.Float(
#             required=False,
#             description="Battery remaining capacity % provided by respective C2 if any.",
#             example=80.0,
#         ),
#     }
# )

sensor_schema = api.model(
    "Sensor",
    {
        "sensor_name": fields.String(
            required=False,
            description="Name of sensor (e.g. MBES for AH1 and SideScan for Ecosub",
            example="MBES",
        ),
        "sensor_status": fields.Boolean(
            required=False,
            description="Sensor switched on (True) or off (False)",
            example=True,
        ),
        "additional_data": fields.Raw(
            required=False,
            description="Add any additional sensor-related data here.",
            example={"sensor_loadtime_seconds": 30.0},
        ),
    }
)
vehicle_status_message_schema = api.model(
    "vehicleStatusMessage",
    {
        "message": fields.Nested(
            message_header_schema,
            required=True,
            description="Message header",
        ),
        "vehicle": fields.Nested(vehicle_schema),
        "vehicle_state": fields.String(
            # TODO: Define dictionary with potential STATES of each vehicle
            required=False,
            description="Current state executed by vehicle. E.g. "
            + "STOP, IDLE, ABORT.",
            example="IDLE",
        ),
        "autonomy_mission_ID": fields.Integer(
            required=False,
            description="Last mission plan ID (according to Autonomy Engine's mission plan number) executed by vehicle",
            example=1,
        ),
        "mission_track_number": fields.Integer(
            required=False,
            description=(
                "Track number - stage in mission (e.g. "
                + "4 --> Waypoint 3 to Waypoint 4)"
            ),
            example=4,
        ),
        "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 vehicle "
            + "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. vehicle + usbl
            required=True,
            description="Metadata pf each vehicle",
        ),
        "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=False,
            description="Battery remaining capacity % provided by respective C2 if any.",
            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 vehicle positions?