"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.autopilotApiRecord = void 0;
const openApiSchemas_1 = require("../openApiSchemas");
const typebox_1 = require("@signalk/server-api/typebox");
const autopilotApiDoc = {
    openapi: '3.0.0',
    info: {
        version: '2.0.0',
        title: 'Signal K Autopilot API',
        termsOfService: 'http://signalk.org/terms/',
        license: {
            name: 'Apache 2.0',
            url: 'http://www.apache.org/licenses/LICENSE-2.0.html'
        }
    },
    externalDocs: {
        url: 'http://signalk.org/specification/',
        description: 'Signal K specification.'
    },
    servers: [{ url: '/signalk/v2/api/vessels/self/autopilots' }],
    tags: [{ name: 'autopilot', description: 'Signal K Autopilot API' }],
    components: {
        schemas: (0, openApiSchemas_1.typeboxToOpenApiSchemas)([
            typebox_1.AutopilotStateDefSchema,
            typebox_1.AutopilotActionDefSchema,
            typebox_1.AutopilotOptionsSchema,
            typebox_1.AngleInputSchema
        ]),
        responses: {
            '200ActionResponse': {
                description: 'PUT OK response',
                content: {
                    'application/json': {
                        schema: {
                            type: 'object',
                            properties: {
                                state: { type: 'string', enum: ['COMPLETED'] },
                                statusCode: { type: 'number', enum: [200] }
                            },
                            required: ['statusCode', 'state']
                        }
                    }
                }
            },
            ErrorResponse: {
                description: 'Failed operation',
                content: {
                    'application/json': {
                        schema: {
                            type: 'object',
                            description: 'Request error response',
                            properties: {
                                state: { type: 'string', enum: ['FAILED'] },
                                statusCode: { type: 'number', enum: [400, 404] },
                                message: { type: 'string' }
                            },
                            required: ['state', 'statusCode', 'message']
                        }
                    }
                }
            }
        },
        parameters: {
            AutopilotIdParam: {
                name: 'id',
                in: 'path',
                description: 'autopilot id',
                required: true,
                schema: { type: 'string' }
            }
        },
        securitySchemes: {
            bearerAuth: {
                type: 'http',
                scheme: 'bearer',
                bearerFormat: 'JWT'
            },
            cookieAuth: {
                type: 'apiKey',
                in: 'cookie',
                name: 'JAUTHENTICATION'
            }
        }
    },
    security: [{ cookieAuth: [] }, { bearerAuth: [] }],
    paths: {
        '/': {
            get: {
                tags: ['autopilot'],
                summary: 'Retrieve list of autopilots.',
                description: 'Returns a list of autopilots indexed by their identifier.',
                responses: {
                    default: {
                        description: 'Autopilot device list response.',
                        content: {
                            'application/json': {
                                schema: {
                                    type: 'object',
                                    additionalProperties: {
                                        type: 'object',
                                        required: ['provider', 'isDefault'],
                                        properties: {
                                            provider: {
                                                type: 'string',
                                                description: 'Provider plugin managing the autopilot device.',
                                                example: 'my-pilot-provider'
                                            },
                                            isDefault: {
                                                type: 'boolean',
                                                description: 'Set to true when the autopilot is currently set as the default.',
                                                example: 'false'
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    error: { $ref: '#/components/responses/ErrorResponse' }
                }
            }
        },
        '/_providers/_default': {
            get: {
                tags: ['autopilot'],
                summary: 'Get the default autopilot device id.',
                description: 'Returns the device id of the autopilot assigned as the default.',
                responses: {
                    default: {
                        description: 'Autopilot configuration response',
                        content: {
                            'application/json': {
                                schema: {
                                    type: 'object',
                                    required: ['id'],
                                    properties: { id: { type: 'string' } }
                                }
                            }
                        }
                    }
                }
            }
        },
        '/_providers/_default/{id}': {
            parameters: [{ $ref: '#/components/parameters/AutopilotIdParam' }],
            post: {
                tags: ['autopilot'],
                summary: 'Set the default autopilot device.',
                description: 'Sets the autopilot with the supplied `id` as the default.',
                responses: {
                    '200ActionResponse': {
                        $ref: '#/components/responses/200ActionResponse'
                    },
                    default: { $ref: '#/components/responses/ErrorResponse' }
                }
            }
        },
        '/{id}': {
            parameters: [{ $ref: '#/components/parameters/AutopilotIdParam' }],
            get: {
                tags: ['autopilot'],
                summary: 'Retrieve autopilot information.',
                description: 'Returns the current state autopilot information including the available options for `state` and `mode`.',
                responses: {
                    default: {
                        description: 'Autopilot configuration response',
                        content: {
                            'application/json': {
                                schema: {
                                    type: 'object',
                                    required: ['state', 'mode', 'target', 'engaged'],
                                    properties: {
                                        engaged: {
                                            type: 'boolean',
                                            description: 'Autopilot is engaged and actively steering the vessel',
                                            example: 'true'
                                        },
                                        state: {
                                            type: 'string',
                                            description: 'Autopilot state',
                                            example: 'auto'
                                        },
                                        mode: {
                                            type: 'string',
                                            description: 'Autopilot operational mode',
                                            example: 'compass'
                                        },
                                        target: {
                                            description: 'Current target value (radians)',
                                            type: 'number',
                                            example: 2.8762
                                        },
                                        options: {
                                            $ref: '#/components/schemas/AutopilotOptions'
                                        }
                                    }
                                }
                            }
                        }
                    },
                    error: { $ref: '#/components/responses/ErrorResponse' }
                }
            }
        },
        '/{id}/options': {
            parameters: [{ $ref: '#/components/parameters/AutopilotIdParam' }],
            get: {
                tags: ['autopilot'],
                summary: 'Retrieve autopilot options.',
                description: 'Returns the selectable options and the values that can be applied (e.g. for`state` and `mode`).',
                responses: {
                    default: {
                        description: 'Autopilot configuration response',
                        content: {
                            'application/json': {
                                schema: {
                                    $ref: '#/components/schemas/AutopilotOptions'
                                }
                            }
                        }
                    },
                    error: { $ref: '#/components/responses/ErrorResponse' }
                }
            }
        },
        '/{id}/engage': {
            parameters: [{ $ref: '#/components/parameters/AutopilotIdParam' }],
            post: {
                tags: ['autopilot'],
                summary: 'Engage autopilot to steer vessel',
                description: 'Provider plugin will set the autopilot to a `state` where it is actively steering the vessel. `state` selected is determined by the provider plugin.',
                responses: {
                    '200ActionResponse': {
                        $ref: '#/components/responses/200ActionResponse'
                    },
                    default: { $ref: '#/components/responses/ErrorResponse' }
                }
            }
        },
        '/{id}/disengage': {
            parameters: [{ $ref: '#/components/parameters/AutopilotIdParam' }],
            post: {
                tags: ['autopilot'],
                summary: 'Disengage autopilot from steering vessel.',
                description: 'Provider plugin will set the autopilot to a `state` where it is NOT actively steering the vessel. `state` selected is determined by the provider plugin.',
                responses: {
                    '200ActionResponse': {
                        $ref: '#/components/responses/200ActionResponse'
                    },
                    default: { $ref: '#/components/responses/ErrorResponse' }
                }
            }
        },
        '/{id}/state': {
            parameters: [{ $ref: '#/components/parameters/AutopilotIdParam' }],
            get: {
                tags: ['autopilot'],
                summary: 'Retrieve the current state.',
                description: 'Returns the current `state` value from the autopilot.',
                responses: {
                    default: {
                        description: 'Autopilot value response',
                        content: {
                            'application/json': {
                                schema: {
                                    type: 'object',
                                    required: ['value'],
                                    properties: {
                                        value: { type: 'string', example: 'standby' }
                                    }
                                }
                            }
                        }
                    },
                    error: { $ref: '#/components/responses/ErrorResponse' }
                }
            },
            put: {
                tags: ['autopilot'],
                summary: 'Set autopilot state.',
                description: 'Set the autopilot to the supplied valid `state` value.',
                requestBody: {
                    description: 'Supply valid `state` value (as per response from autopilot information request).',
                    required: true,
                    content: {
                        'application/json': {
                            schema: {
                                type: 'object',
                                properties: {
                                    value: {
                                        type: 'string',
                                        description: 'Value representing the `state` the autopilot is to enter.',
                                        example: 'enabled'
                                    }
                                }
                            }
                        }
                    }
                },
                responses: {
                    '200ActionResponse': {
                        $ref: '#/components/responses/200ActionResponse'
                    },
                    default: { $ref: '#/components/responses/ErrorResponse' }
                }
            }
        },
        '/{id}/mode': {
            parameters: [{ $ref: '#/components/parameters/AutopilotIdParam' }],
            get: {
                tags: ['autopilot'],
                summary: 'Retrieve the current mode.',
                description: 'Returns the current `mode` value from the autopilot.',
                responses: {
                    default: {
                        description: 'Autopilot value response',
                        content: {
                            'application/json': {
                                schema: {
                                    type: 'object',
                                    required: ['value'],
                                    properties: {
                                        value: { type: 'string', example: 'compass' }
                                    }
                                }
                            }
                        }
                    },
                    error: { $ref: '#/components/responses/ErrorResponse' }
                }
            },
            put: {
                tags: ['autopilot'],
                summary: 'Set autopilot mode',
                description: 'Set the autopilot to the supplied valid `mode` value.',
                requestBody: {
                    description: 'Supply valid `mode` value (as per response from autopilot information request).',
                    required: true,
                    content: {
                        'application/json': {
                            schema: {
                                type: 'object',
                                properties: {
                                    value: {
                                        type: 'string',
                                        description: 'Value representing the `mode` the autopilot is to enter.',
                                        example: 'compass'
                                    }
                                }
                            }
                        }
                    }
                },
                responses: {
                    '200ActionResponse': {
                        $ref: '#/components/responses/200ActionResponse'
                    },
                    default: { $ref: '#/components/responses/ErrorResponse' }
                }
            }
        },
        '/{id}/target': {
            parameters: [{ $ref: '#/components/parameters/AutopilotIdParam' }],
            get: {
                tags: ['autopilot'],
                summary: 'Retrieve the current target value.',
                description: 'The current target value in radians.',
                responses: {
                    default: {
                        description: 'Autopilot value response',
                        content: {
                            'application/json': {
                                schema: {
                                    type: 'object',
                                    required: ['value'],
                                    properties: {
                                        value: {
                                            type: 'number',
                                            description: 'Value in radians',
                                            example: 2.456
                                        }
                                    }
                                }
                            }
                        }
                    },
                    error: { $ref: '#/components/responses/ErrorResponse' }
                }
            },
            put: {
                tags: ['autopilot'],
                summary: 'Set autopilot `target` value.',
                description: 'Value supplied must fall within the valid range (-180 & 360 degrees / PI & 2 * PI radians).',
                requestBody: {
                    description: 'Value within the valid range.',
                    required: true,
                    content: {
                        'application/json': {
                            schema: { $ref: '#/components/schemas/AngleInput' }
                        }
                    }
                },
                responses: {
                    '200ActionResponse': {
                        $ref: '#/components/responses/200ActionResponse'
                    },
                    default: { $ref: '#/components/responses/ErrorResponse' }
                }
            }
        },
        '/{id}/target/adjust': {
            parameters: [{ $ref: '#/components/parameters/AutopilotIdParam' }],
            put: {
                tags: ['autopilot'],
                summary: 'Adjust autopilot target value by +/- degrees / radians.',
                description: 'Value supplied will be added to the current target. The result must fall within the valid range (-180 & 360 degrees / PI & 2 * PI radians).',
                requestBody: {
                    description: 'Value to add to the current `target`.',
                    required: true,
                    content: {
                        'application/json': {
                            schema: { $ref: '#/components/schemas/AngleInput' }
                        }
                    }
                },
                responses: {
                    '200ActionResponse': {
                        $ref: '#/components/responses/200ActionResponse'
                    },
                    default: { $ref: '#/components/responses/ErrorResponse' }
                }
            }
        },
        '/{id}/tack/port': {
            parameters: [{ $ref: '#/components/parameters/AutopilotIdParam' }],
            post: {
                tags: ['autopilot'],
                summary: 'Tack to port.',
                description: 'Execute a port tack.',
                responses: {
                    '200ActionResponse': {
                        $ref: '#/components/responses/200ActionResponse'
                    },
                    default: { $ref: '#/components/responses/ErrorResponse' }
                }
            }
        },
        '/{id}/tack/starboard': {
            parameters: [{ $ref: '#/components/parameters/AutopilotIdParam' }],
            post: {
                tags: ['autopilot'],
                summary: 'Tack to starboard.',
                description: 'Execute a starboard tack.',
                responses: {
                    '200ActionResponse': {
                        $ref: '#/components/responses/200ActionResponse'
                    },
                    default: { $ref: '#/components/responses/ErrorResponse' }
                }
            }
        },
        '/{id}/gybe/port': {
            parameters: [{ $ref: '#/components/parameters/AutopilotIdParam' }],
            post: {
                tags: ['autopilot'],
                summary: 'Gybe to port.',
                description: 'Execute a gybe to port.',
                responses: {
                    '200ActionResponse': {
                        $ref: '#/components/responses/200ActionResponse'
                    },
                    default: { $ref: '#/components/responses/ErrorResponse' }
                }
            }
        },
        '/{id}/gybe/starboard': {
            parameters: [{ $ref: '#/components/parameters/AutopilotIdParam' }],
            post: {
                tags: ['autopilot'],
                summary: 'Gybe to starboard.',
                description: 'Execute a gybe to starboard.',
                responses: {
                    '200ActionResponse': {
                        $ref: '#/components/responses/200ActionResponse'
                    },
                    default: { $ref: '#/components/responses/ErrorResponse' }
                }
            }
        },
        '/{id}/dodge': {
            parameters: [{ $ref: '#/components/parameters/AutopilotIdParam' }],
            post: {
                tags: ['autopilot'],
                summary: 'Turn on dodge mode.',
                description: 'Enter dodge mode at the current course setting.',
                responses: {
                    '200ActionResponse': {
                        $ref: '#/components/responses/200ActionResponse'
                    },
                    default: { $ref: '#/components/responses/ErrorResponse' }
                }
            },
            delete: {
                tags: ['autopilot'],
                summary: 'Turn Off dodge mode.',
                description: 'Resume steering original course.',
                responses: {
                    '200ActionResponse': {
                        $ref: '#/components/responses/200ActionResponse'
                    },
                    default: { $ref: '#/components/responses/ErrorResponse' }
                }
            },
            put: {
                tags: ['autopilot'],
                summary: 'Steer port / starboard to dodge obstacles.',
                description: 'Override the current course to change direction the supplied number of degrees / radians.',
                requestBody: {
                    description: '+/- value to change direction (-ive = port).',
                    required: true,
                    content: {
                        'application/json': {
                            schema: { $ref: '#/components/schemas/AngleInput' }
                        }
                    }
                },
                responses: {
                    '200ActionResponse': {
                        $ref: '#/components/responses/200ActionResponse'
                    },
                    default: { $ref: '#/components/responses/ErrorResponse' }
                }
            }
        },
        '/{id}/courseCurrentPoint': {
            parameters: [{ $ref: '#/components/parameters/AutopilotIdParam' }],
            post: {
                tags: ['autopilot'],
                summary: 'Steer to the currently set destination position',
                description: 'Provider plugin will instruct the autopilot to steer to the destination position.',
                responses: {
                    '200ActionResponse': {
                        $ref: '#/components/responses/200ActionResponse'
                    },
                    default: { $ref: '#/components/responses/ErrorResponse' }
                }
            }
        },
        '/{id}/courseNextPoint': {
            parameters: [{ $ref: '#/components/parameters/AutopilotIdParam' }],
            post: {
                tags: ['autopilot'],
                summary: 'Advance to next waypoint in route',
                description: 'Provider plugin will instruct the autopilot to advance to the next waypoint along the route.',
                responses: {
                    '200ActionResponse': {
                        $ref: '#/components/responses/200ActionResponse'
                    },
                    default: { $ref: '#/components/responses/ErrorResponse' }
                }
            }
        }
    }
};
exports.autopilotApiRecord = {
    name: 'autopilot',
    path: '/signalk/v2/api/vessels/self/autopilots',
    apiDoc: autopilotApiDoc
};
//# sourceMappingURL=openApi.js.map