{
  "openapi": "3.0.3",
  "info": {
    "title": "Palabre Bot API",
    "version": "1.0.0",
    "description": "API bots style Telegram pour Palabre.\n\nAuthentification : en-tête `Authorization: Bearer palbot_…` (jeton obtenu dans la conversation privée avec le bot).\n\nBase URL : `https://<VOTRE_API>/functions/v1/bot-api`\n\nSur palabre.eu, `<VOTRE_API>` est l’URL Supabase (même adresse que « Adresse du serveur » dans l’app)."
  },
  "servers": [
    {
      "url": "/functions/v1/bot-api",
      "description": "Chemin relatif (à combiner avec l’URL API de votre instance)"
    }
  ],
  "security": [{ "BotToken": [] }],
  "components": {
    "securitySchemes": {
      "BotToken": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "palbot",
        "description": "Jeton bot `palbot_<userHex>_<secret>`"
      }
    },
    "schemas": {
      "OkEnvelope": {
        "type": "object",
        "properties": {
          "ok": { "type": "boolean", "example": true },
          "result": {}
        }
      },
      "ErrorEnvelope": {
        "type": "object",
        "properties": {
          "ok": { "type": "boolean", "example": false },
          "error": { "type": "string" }
        }
      },
      "SendMessageBody": {
        "type": "object",
        "required": ["chat_id", "text"],
        "properties": {
          "chat_id": {
            "type": "string",
            "format": "uuid",
            "description": "UUID du canal Palabre. Mobile : tapez `/channelid` dans le canal (le bot répond). Web : URL `/channel/<id>` ou DM."
          },
          "text": { "type": "string", "maxLength": 8000 },
          "client_message_id": { "type": "string", "format": "uuid" }
        }
      },
      "EditMessageBody": {
        "type": "object",
        "required": ["message_id", "text"],
        "properties": {
          "message_id": {
            "type": "string",
            "format": "uuid",
            "description": "UUID du message renvoyé par sendMessage (`result.message_id`)"
          },
          "text": { "type": "string", "maxLength": 8000 }
        }
      },
      "GetUpdatesBody": {
        "type": "object",
        "properties": {
          "offset": { "type": "integer", "minimum": 0, "default": 0 },
          "limit": { "type": "integer", "minimum": 1, "maximum": 100, "default": 100 }
        }
      },
      "SetWebhookBody": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "URL HTTPS, ou chaîne vide / omise pour supprimer"
          }
        }
      }
    }
  },
  "paths": {
    "/getMe": {
      "post": {
        "operationId": "getMe",
        "summary": "Identité du bot",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/OkEnvelope" },
                "example": {
                  "ok": true,
                  "result": {
                    "id": "uuid-user",
                    "bot_id": "uuid-bot",
                    "is_bot": true,
                    "username": "monassistant_bot",
                    "first_name": "Mon assistant",
                    "workspace_id": "uuid-workspace"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Jeton manquant ou invalide",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorEnvelope" } } }
          }
        }
      }
    },
    "/sendMessage": {
      "post": {
        "operationId": "sendMessage",
        "summary": "Envoyer un message dans un canal",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": { "$ref": "#/components/schemas/SendMessageBody" }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Message envoyé",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OkEnvelope" } } }
          },
          "400": {
            "description": "Erreur métier",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorEnvelope" } } }
          }
        }
      }
    },
    "/editMessageText": {
      "post": {
        "operationId": "editMessageText",
        "summary": "Modifier un message envoyé par le bot",
        "description": "Seul l’auteur (ce bot) peut modifier le message. Alias : `/editMessage`.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": { "$ref": "#/components/schemas/EditMessageBody" }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Message modifié",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OkEnvelope" } } }
          },
          "400": {
            "description": "Erreur métier",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorEnvelope" } } }
          }
        }
      }
    },
    "/getUpdates": {
      "post": {
        "operationId": "getUpdates",
        "summary": "Recevoir les messages (long-poll)",
        "description": "Rejouer avec `offset` = dernier `update_id` + 1. Préférez ce mode au webhook push (pas de SSRF depuis la base).",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": { "$ref": "#/components/schemas/GetUpdatesBody" }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Liste d’updates",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OkEnvelope" } } }
          }
        }
      }
    },
    "/setWebhook": {
      "post": {
        "operationId": "setWebhook",
        "summary": "Enregistrer une URL webhook HTTPS",
        "description": "Métadonnée uniquement : la livraison push n’est pas faite depuis la base. Utilisez getUpdates ou un worker.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": { "$ref": "#/components/schemas/SetWebhookBody" }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OkEnvelope" } } }
          }
        }
      }
    },
    "/deleteWebhook": {
      "post": {
        "operationId": "deleteWebhook",
        "summary": "Supprimer le webhook",
        "responses": {
          "200": {
            "description": "OK",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OkEnvelope" } } }
          }
        }
      }
    }
  }
}
