openapi: 3.0.0
info:
  title: Bloop API
  description: API da Plataforma Bloop - Sistema Integrado para Gestão Automotiva
  version: 1.0.0
  contact:
    name: Equipe Bloop
    email: api@bloop.com.br
    url: https://bloop.com.br
  license:
    name: MIT
    url: https://opensource.org/licenses/MIT

servers:
  - url: http://localhost:8000
    description: Servidor de Desenvolvimento
  - url: https://api.bloop.com.br
    description: Servidor de Produção

tags:
  - name: Autenticação
    description: Endpoints de autenticação e autorização
  - name: Usuários
    description: Gestão de usuários do sistema
  - name: Veículos
    description: Gestão de veículos dos clientes
  - name: Oficinas
    description: Gestão de oficinas parceiras
  - name: Agendamentos
    description: Sistema de agendamentos
  - name: Orçamentos
    description: Gestão de orçamentos
  - name: Pagamentos
    description: Sistema de pagamentos

paths:
  /api/test:
    get:
      tags:
        - Teste
      summary: Teste da API
      description: Verifica se a API está funcionando
      responses:
        '200':
          description: API funcionando corretamente
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: "API Bloop funcionando corretamente"
                  version:
                    type: string
                    example: "1.0.0"
                  timestamp:
                    type: string
                    format: date-time

  /api/auth/login:
    post:
      tags:
        - Autenticação
      summary: Realizar login
      description: Autentica um usuário e retorna um token de acesso
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - email
                - password
              properties:
                email:
                  type: string
                  format: email
                  example: usuario@exemplo.com
                password:
                  type: string
                  format: password
                  example: senha123
      responses:
        '200':
          description: Login realizado com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: "Login realizado com sucesso"
                  data:
                    type: object
                    properties:
                      user:
                        $ref: '#/components/schemas/User'
                      token:
                        type: string
                        example: "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."
                  timestamp:
                    type: string
                    format: date-time
        '401':
          description: Credenciais inválidas
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '422':
          description: Dados de entrada inválidos
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'

  /api/auth/logout:
    post:
      tags:
        - Autenticação
      summary: Realizar logout
      description: Revoga o token de acesso do usuário autenticado
      security:
        - bearerAuth: []
      responses:
        '200':
          description: Logout realizado com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: "Logout realizado com sucesso"
                  timestamp:
                    type: string
                    format: date-time
        '401':
          description: Não autorizado
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'

  /api/auth/me:
    get:
      tags:
        - Autenticação
      summary: Obter dados do usuário autenticado
      description: Retorna os dados do usuário atualmente autenticado
      security:
        - bearerAuth: []
      responses:
        '200':
          description: Dados do usuário obtidos com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: "Dados do usuário obtidos com sucesso"
                  data:
                    $ref: '#/components/schemas/User'
                  timestamp:
                    type: string
                    format: date-time
        '401':
          description: Não autorizado
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'

  /api/veiculos:
    get:
      tags:
        - Veículos
      summary: Listar veículos
      description: Retorna uma lista paginada de veículos
      security:
        - bearerAuth: []
      parameters:
        - name: page
          in: query
          description: Número da página
          required: false
          schema:
            type: integer
            example: 1
        - name: per_page
          in: query
          description: Itens por página
          required: false
          schema:
            type: integer
            example: 15
        - name: search
          in: query
          description: Termo de busca
          required: false
          schema:
            type: string
            example: "Honda"
        - name: status
          in: query
          description: Filtrar por status
          required: false
          schema:
            type: string
            example: "ativo"
      responses:
        '200':
          description: Lista de veículos obtida com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: "Lista de veículos obtida com sucesso"
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/Veiculo'
                  pagination:
                    $ref: '#/components/schemas/Pagination'
                  timestamp:
                    type: string
                    format: date-time
        '401':
          description: Não autorizado
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'

    post:
      tags:
        - Veículos
      summary: Criar veículo
      description: Cria um novo veículo no sistema
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VeiculoCreateRequest'
      responses:
        '201':
          description: Veículo criado com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: "Veículo criado com sucesso"
                  data:
                    $ref: '#/components/schemas/Veiculo'
                  timestamp:
                    type: string
                    format: date-time
        '422':
          description: Dados de entrada inválidos
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
        '401':
          description: Não autorizado
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'

  /api/veiculos/{id}:
    get:
      tags:
        - Veículos
      summary: Obter veículo
      description: Retorna os dados de um veículo específico
      security:
        - bearerAuth: []
      parameters:
        - name: id
          in: path
          description: ID do veículo
          required: true
          schema:
            type: integer
            example: 1
      responses:
        '200':
          description: Veículo obtido com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: "Veículo obtido com sucesso"
                  data:
                    $ref: '#/components/schemas/Veiculo'
                  timestamp:
                    type: string
                    format: date-time
        '404':
          description: Veículo não encontrado
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Não autorizado
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'

    put:
      tags:
        - Veículos
      summary: Atualizar veículo
      description: Atualiza os dados de um veículo existente
      security:
        - bearerAuth: []
      parameters:
        - name: id
          in: path
          description: ID do veículo
          required: true
          schema:
            type: integer
            example: 1
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VeiculoUpdateRequest'
      responses:
        '200':
          description: Veículo atualizado com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: "Veículo atualizado com sucesso"
                  data:
                    $ref: '#/components/schemas/Veiculo'
                  timestamp:
                    type: string
                    format: date-time
        '404':
          description: Veículo não encontrado
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '422':
          description: Dados de entrada inválidos
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
        '401':
          description: Não autorizado
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'

    delete:
      tags:
        - Veículos
      summary: Excluir veículo
      description: Remove um veículo do sistema
      security:
        - bearerAuth: []
      parameters:
        - name: id
          in: path
          description: ID do veículo
          required: true
          schema:
            type: integer
            example: 1
      responses:
        '200':
          description: Veículo excluído com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: "Veículo excluído com sucesso"
                  timestamp:
                    type: string
                    format: date-time
        '404':
          description: Veículo não encontrado
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Não autorizado
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'

components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: Token de autenticação JWT

  schemas:
    User:
      type: object
      properties:
        id:
          type: integer
          example: 1
        name:
          type: string
          example: "João Silva"
        email:
          type: string
          format: email
          example: "joao@exemplo.com"
        role:
          type: string
          example: "usuario"
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time

    Veiculo:
      type: object
      properties:
        id:
          type: integer
          example: 1
        cliente_id:
          type: integer
          example: 1
        placa:
          type: string
          example: "ABC1234"
        marca:
          type: string
          example: "Honda"
        modelo:
          type: string
          example: "Civic"
        ano:
          type: integer
          example: 2020
        cor:
          type: string
          example: "Branco"
        status:
          type: string
          example: "ativo"
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time

    VeiculoCreateRequest:
      type: object
      required:
        - cliente_id
        - placa
        - marca
        - modelo
        - ano
      properties:
        cliente_id:
          type: integer
          example: 1
        placa:
          type: string
          example: "ABC1234"
        marca:
          type: string
          example: "Honda"
        modelo:
          type: string
          example: "Civic"
        ano:
          type: integer
          example: 2020
        cor:
          type: string
          example: "Branco"
        status:
          type: string
          example: "ativo"

    VeiculoUpdateRequest:
      type: object
      properties:
        placa:
          type: string
          example: "ABC1234"
        marca:
          type: string
          example: "Honda"
        modelo:
          type: string
          example: "Civic"
        ano:
          type: integer
          example: 2020
        cor:
          type: string
          example: "Branco"
        status:
          type: string
          example: "ativo"

    Pagination:
      type: object
      properties:
        current_page:
          type: integer
          example: 1
        per_page:
          type: integer
          example: 15
        total:
          type: integer
          example: 100
        last_page:
          type: integer
          example: 7
        from:
          type: integer
          example: 1
        to:
          type: integer
          example: 15

    ErrorResponse:
      type: object
      properties:
        success:
          type: boolean
          example: false
        message:
          type: string
          example: "Erro interno do servidor"
        timestamp:
          type: string
          format: date-time

    ValidationErrorResponse:
      type: object
      properties:
        success:
          type: boolean
          example: false
        message:
          type: string
          example: "Dados de entrada inválidos"
        errors:
          type: object
          additionalProperties:
            type: array
            items:
              type: string
        timestamp:
          type: string
          format: date-time
