{
  "openapi": "3.0.3",
  "info": {
    "title": "Collector API",
    "version": "1.2.1",
    "description": "API para coleta e processamento de dados de GPS de veículos, incluindo localização, velocidade e informações do dispositivo."
  },
  "servers": [
    {
      "url": "https://collector.zarv.com",
      "description": "Produção"
    }
  ],
  "tags": [
    { "name": "GPS", "description": "API de Coleta de Dados de GPS" },
    { "name": "Câmera", "description": "API de Coleta de Dados de Cameras" }
  ],
  "paths": {
    "/api/v3/gps-signal": {
      "post": {
        "summary": "Enviar dados de GPS do veículo",
        "description": "Endpoint para receber e processar dados de localização GPS de veículos, incluindo coordenadas, velocidade, direção e informações do dispositivo.",
        "tags": ["GPS"],
        "security": [
          {
            "BasicAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "plate": {
                    "type": "string",
                    "description": "Placa do veículo",
                    "example": "rLE-1d79"
                  },
                  "vin": {
                    "type": "string",
                    "description": "Número de identificação do veículo (VIN)",
                    "example": "abcdef123ss"
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude da localização do veículo",
                    "example": -23.55052
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude da localização do veículo",
                    "example": -46.63331
                  },
                  "elevation": {
                    "type": "number",
                    "format": "double",
                    "description": "Elevação em metros",
                    "example": 760.5
                  },
                  "timestamp": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Data e hora da leitura GPS em formato ISO 8601",
                    "example": "2025-08-15T13:45:30Z"
                  },
                  "deviceId": {
                    "type": "string",
                    "description": "Identificador único do dispositivo GPS",
                    "example": "DEV-123456789"
                  },
                  "speed": {
                    "type": "number",
                    "format": "double",
                    "description": "Velocidade do veículo em km/h",
                    "example": 62.3
                  },
                  "heading": {
                    "type": "number",
                    "format": "double",
                    "description": "Direção do veículo em graus (0-360)",
                    "example": 175.0
                  },
                  "accuracy": {
                    "type": "number",
                    "format": "double",
                    "description": "Precisão da leitura GPS em metros",
                    "example": 5.2
                  }
                },
                "required": [
                  "plate",
                  "vin",
                  "latitude",
                  "longitude",
                  "timestamp",
                  "deviceId"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Dados de GPS recebidos e processados com sucesso",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PostGpsResponse"
                }
              }
            }
          },
          "401": {
            "description": "Acesso não autorizado - credenciais Basic Auth inválidas ou ausentes",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "statusCode": {
                      "type": "integer",
                      "example": 401
                    },
                    "message": {
                      "type": "string",
                      "example": "Você não tem permissão para acessar este recurso."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Dados inválidos na requisição",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "statusCode": {
                      "type": "integer",
                      "example": 400
                    },
                    "message": {
                      "type": "string",
                      "example": "Dados inválidos. Verifique os campos obrigatórios."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v3/cam-signal": {
      "post": {
        "summary": "Enviar dados de câmeras",
        "description": "Endpoint para receber e processar dados de câmeras de monitoramento de veículos, incluindo localização, endereço e informações do dispositivo.",
        "tags": ["Câmera"],
        "security": [
          {
            "BasicAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "plate": {
                    "type": "string",
                    "description": "Placa do veículo",
                    "example": "rLE-1d79"
                  },
                  "address": {
                    "type": "string",
                    "description": "Endereço onde a câmera está localizada",
                    "example": "rua da camera, 1897"
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude da localização da câmera",
                    "example": -23.55052
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude da localização da câmera",
                    "example": -46.63331
                  },
                  "timestamp": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Data e hora da captura da câmera em formato ISO 8601",
                    "example": "2025-08-15T13:45:30Z"
                  },
                  "deviceId": {
                    "type": "string",
                    "description": "Identificador único do dispositivo de câmera",
                    "example": "DEV-123456789"
                  },
                  "speed": {
                    "type": "number",
                    "format": "double",
                    "description": "Velocidade do veículo detectada pela câmera em km/h",
                    "example": 62.3
                  }
                },
                "required": [
                  "plate",
                  "address",
                  "latitude",
                  "longitude",
                  "timestamp",
                  "deviceId"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Dados de câmera recebidos e processados com sucesso",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PostCamResponse"
                }
              }
            }
          },
          "401": {
            "description": "Acesso não autorizado - credenciais Basic Auth inválidas ou ausentes",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "statusCode": {
                      "type": "integer",
                      "example": 401
                    },
                    "message": {
                      "type": "string",
                      "example": "Você não tem permissão para acessar este recurso."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Dados inválidos na requisição",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "statusCode": {
                      "type": "integer",
                      "example": 400
                    },
                    "message": {
                      "type": "string",
                      "example": "Dados inválidos. Verifique os campos obrigatórios."
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "BasicAuth": {
        "type": "http",
        "scheme": "basic",
        "description": "Autenticação Basic Auth. O cabeçalho deve ser: `Authorization: Basic {base64(username:password)}`"
      }
    },
    "schemas": {
      "PostGpsResponse": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "description": "Status da operação",
            "example": "success"
          },
          "message": {
            "type": "string",
            "description": "Mensagem de confirmação",
            "example": "GPS data received successfully"
          }
        },
        "required": ["status", "message"]
      },
      "PostCamResponse": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "description": "Status da operação",
            "example": "success"
          },
          "message": {
            "type": "string",
            "description": "Mensagem de confirmação",
            "example": "Camera data received successfully"
          }
        },
        "required": ["status", "message"]
      }
    }
  }
}
