"""
    schemas: configuration sent to Autonomy Engine (i.e. during an emergency,
    if a platform needs to be removed from the mission planning)
"""

emergency_schema = {
    "type": "object",
    "properties": {
        "safe_command": {
            "type": "string",
            "enum": ["go_home", "abort_now", "stop_mission"],
            "description": "Command/Action that is native to respective"
            + " partner's platform/C2",
            "example": "go_home",
        },
        "target_waypoint_latitude": {
            "type": "number",
            "format": "float",
            "description": "X-coordinate safe place for respective platform",
            "example": -7.432,
        },
        "target_waypoint_longitude": {
            "type": "number",
            "format": "float",
            "description": "Y-coordinate safe place for respective platform",
            "example": 50.365,
        },
        "target_depth": {
            "type": "number",
            "format": "float",
            "description": "Z-coordinate safe place for respective platform"
            + " . If platform to NOT stay at depth, key in `0.0`",
            "example": 10.0,
        },
        "additional_data": {
            "description": "Any addition fields/data to be added here",
            "example": {},
        },
    },
    "required": [
        "target_waypoint_latitude",
        "target_waypoint_longitude",
        "target_depth",
    ],
}


platform_schema = {
    "type": "object",
    "properties": {
        "platform_ID": {
            "type": "string",
            "description": "Unique identifier for this platform",
            "example": "reav-x-1",
        },
        "model": {
            "type": "string",
            "example": "reav",
        },
        "emergency": emergency_schema,
        "min_altitude": {
            "type": "number",
            "format": "float",
            "description": "Minimum altitude set for squad.",
            "example": 15.2,
        },
        "min_velocity": {
            "type": "number",
            "format": "float",
            "description": "Minimum velocity set for squad.",
            "example": 0.1,
        },
        "max_velocity": {
            "type": "number",
            "format": "float",
            "description": "Maximum altitude set for squad.",
            "example": 0.9,
        },
        "additional_data": {
            "description": "Any addition fields/data to be added here",
            "example": {"swath_width": 10.0, "scan_type": "DVL"},
            "type": "object",
        },
    },
    "required": [
        "platform_ID",
        "model",
        "emergency",
        "min_altitude",
        "min_velocity",
        "max_velocity",
    ],
}

region_schema = {
    "type": "object",
    "properties": {
        "geometry_coordinates": {
            "type": "array",  # TODO: Check if config defn is right.
            "example": [
                [
                    [-4.187143188645706, 50.37072283932642],
                    [-4.202697005964865, 50.368816892405874],
                    [-4.203156724702808, 50.365640144076906],
                    [-4.19449868846155, 50.362267670845654],
                ]
            ],
        },
    },
    "description": "Using GEOJSON, exact 4-point region (rectangle shaped)",
}

squad_metadata_schema = {
    "type": "object",
    "properties": {
        "squad_ID": {
            "type": "integer",
            "description": "Identifier of given squad",
            "example": 23,
        },
        "no_of_platforms": {
            "type": "integer",
            "description": "Number of platforms",
            "example": 3,
        },
        "platforms": {
            "type": "array",
            "items": platform_schema,
            "description": "Squad consists of these platforms",
        },
        "squad_mission_type": {
            "type": "string",
            "enum": ["tracking", "survey", "inspection"],
            "description": "Mission of given squad: `tracking`, `survey`"
            + ", `inspection`",
            "example": "survey",
        },
        "squad_state": {
            "type": "string",
            "description": "In execution, Waiting.. <define further>",
            "example": False,
        },
        "region_of_interest": region_schema,
    },
    "required": [
        "squad_ID",
        "no_of_platforms",
        "platforms",
        "squad_mission_type",
        "squad_state",
    ],
}

planning_configuration_schema = {
    "type": "object",
    "properties": {
        "message_type": {
            "type": "string",
            "description": "Type of message",
            "example": "planning_configuration",
            "enum": ["planning_configuration"],
        },
        "planning_config_ID": {
            "type": "integer",
            "description": "Unique identifier tagged to version of this"
            + " configuration plan",
            "example": 3,
        },
        "exclusion_zones": {
            "type": "array",
            "items": region_schema,
            "description": "Exclusion zones for all platforms",
        },
        "squads": {
            "type": "array",
            "items": squad_metadata_schema,
        },
    },
    "required": [
        "message_type",
        "planning_config_ID",
        "squads",
        "exclusion_zones",
    ],
}