{
  "info": {
    "name": "Bepudo API — Sandbox",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://api-sandbox.bepudo.com/v0.2"
    },
    {
      "key": "apiKey",
      "value": "bepudo_test_2fb59f5bc13a141a5617655a3c673f07311807c2d4ca94c38129ca6ac244a375_73a5533b"
    },
    {
      "key": "jwtToken",
      "value": ""
    },
    {
      "key": "sessionToken",
      "value": ""
    },
    {
      "key": "pudoUuid",
      "value": "7b2e662a-579c-43d3-b3c7-edf8438090c6"
    },
    {
      "key": "packageCode",
      "value": "PKG-DINGOO-001"
    }
  ],
  "item": [
    {
      "name": "1. Autenticação",
      "item": [
        {
          "name": "Obter JWT",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "const res = pm.response.json();",
                  "if (res.token) {",
                  "    pm.collectionVariables.set('jwtToken', res.token);",
                  "    console.log('✅ JWT guardado');",
                  "}"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "X-API-Key",
                "value": "{{apiKey}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/auth/token",
              "host": ["{{baseUrl}}"],
              "path": ["auth", "token"]
            },
            "description": "Troca a API Key por um JWT de curta duração (1h). Guarda automaticamente o token na variável `jwtToken`."
          }
        },
        {
          "name": "Criar Sessão (com TOTP)",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "const res = pm.response.json();",
                  "if (res.token) {",
                  "    pm.collectionVariables.set('sessionToken', res.token);",
                  "    console.log('✅ Session Token guardado (válido 5 min)');",
                  "}"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{jwtToken}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"pudoUuid\": \"{{pudoUuid}}\",\n  \"totpCode\": \"12345678\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/session",
              "host": ["{{baseUrl}}"],
              "path": ["session"]
            },
            "description": "Cria uma sessão provando presença física no PUDO via código TOTP (lido do ecrã da loja). Session Token válido 5 minutos. Guarda automaticamente em `sessionToken`.\n\n⚠️ Atualiza o `totpCode` com o valor obtido em `GET /pudos/{pudoUuid}/totp-code`."
          }
        }
      ]
    },
    {
      "name": "2. PUDOs",
      "item": [
        {
          "name": "Pesquisar por Coordenadas",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{jwtToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/pudos?latitude=38.7106&longitude=-9.1387&radius=5",
              "host": ["{{baseUrl}}"],
              "path": ["pudos"],
              "query": [
                { "key": "latitude", "value": "38.7106" },
                { "key": "longitude", "value": "-9.1387" },
                { "key": "radius", "value": "5" }
              ]
            },
            "description": "Pesquisa PUDOs num raio de 5km. Valores de exemplo centrados na Mercearia Central Baixa (Lisboa)."
          }
        },
        {
          "name": "Pesquisar por Código Postal",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{jwtToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/pudos?postalCode=1100-053",
              "host": ["{{baseUrl}}"],
              "path": ["pudos"],
              "query": [
                { "key": "postalCode", "value": "1100-053" }
              ]
            },
            "description": "Pesquisa por código postal exato. Devolve a Mercearia Central Baixa."
          }
        },
        {
          "name": "Obter PUDO por UUID",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{jwtToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/pudos/{{pudoUuid}}",
              "host": ["{{baseUrl}}"],
              "path": ["pudos", "{{pudoUuid}}"]
            }
          }
        },
        {
          "name": "[Sandbox] Obter TOTP do PUDO",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "const res = pm.response.json();",
                  "if (res.totpCode) {",
                  "    console.log('🔑 TOTP: ' + res.totpCode + ' | Expira em: ' + res.expiresIn + 's');",
                  "    if (res.expiresIn < 5) {",
                  "        console.warn('⚠️ Código quase a expirar! Aguarda e corre de novo.');",
                  "    }",
                  "}"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{jwtToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/pudos/{{pudoUuid}}/totp-code",
              "host": ["{{baseUrl}}"],
              "path": ["pudos", "{{pudoUuid}}", "totp-code"]
            },
            "description": "⚠️ Apenas Sandbox. Devolve o código TOTP atual do PUDO (o que estaria no ecrã físico da loja). Usa este código no `POST /session`.\n\nSe `expiresIn < 5`, corre novamente após a rotação."
          }
        }
      ]
    },
    {
      "name": "3. Encomendas",
      "item": [
        {
          "name": "Criar Encomenda (ooh)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{jwtToken}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"orders\": [\n    {\n      \"packageCode\": \"{{packageCode}}\",\n      \"pudoUuid\": \"{{pudoUuid}}\",\n      \"orderType\": \"ooh\",\n      \"customerName\": \"Nome do Cliente\",\n      \"dimensions\": {\n        \"length\": 10,\n        \"width\": 20,\n        \"height\": 30,\n        \"weight\": 1000\n      },\n      \"securityToken\": {\n        \"value\": \"CODIGO-PARA-O-CLIENTE\",\n        \"isManual\": true\n      }\n    }\n  ]\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/orders",
              "host": ["{{baseUrl}}"],
              "path": ["orders"]
            },
            "description": "Cria uma encomenda Out of Home (entrega falhada → PUDO). O `securityToken` é o código que o cliente usa para levantar a encomenda na loja — diferente do TOTP do driver."
          }
        },
        {
          "name": "Listar Encomendas",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{jwtToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/orders?page=1&limit=10",
              "host": ["{{baseUrl}}"],
              "path": ["orders"],
              "query": [
                { "key": "page", "value": "1" },
                { "key": "limit", "value": "10" }
              ]
            },
            "description": "Devolve encomendas dos últimos 3 meses."
          }
        },
        {
          "name": "Obter Encomenda",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{jwtToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/orders/{{packageCode}}",
              "host": ["{{baseUrl}}"],
              "path": ["orders", "{{packageCode}}"]
            }
          }
        },
        {
          "name": "Scan — Entrega Física no PUDO",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{jwtToken}}"
              },
              {
                "key": "X-Session-Token",
                "value": "{{sessionToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/orders/{{packageCode}}/scan",
              "host": ["{{baseUrl}}"],
              "path": ["orders", "{{packageCode}}", "scan"]
            },
            "description": "Confirma a entrega física da encomenda no PUDO.\n\nB2C (ooh/ath): documented → checking_pending\nC2B (rtn/ndr): at_pudo → collected\n\nRequer o Session Token obtido em `POST /session`."
          }
        },
        {
          "name": "Atualizar Estado (bulk)",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{jwtToken}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"orders\": [\n    {\n      \"packageCode\": \"{{packageCode}}\",\n      \"newStatus\": \"at_pudo\"\n    }\n  ]\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/orders",
              "host": ["{{baseUrl}}"],
              "path": ["orders"]
            }
          }
        },
        {
          "name": "Cancelar Encomenda",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{jwtToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/orders/{{packageCode}}",
              "host": ["{{baseUrl}}"],
              "path": ["orders", "{{packageCode}}"]
            },
            "description": "Se `documented`: remove completamente.\nSe `at_pudo` e B2C: cancela e cria automaticamente uma ordem `ndr`."
          }
        }
      ]
    },
    {
      "name": "4. Helpers Sandbox",
      "item": [
        {
          "name": "[Sandbox] checking_pending → at_pudo",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{jwtToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/orders/set-at-pudo",
              "host": ["{{baseUrl}}"],
              "path": ["orders", "set-at-pudo"]
            },
            "description": "⚠️ Apenas Sandbox. Simula a loja a confirmar receção de todos os pacotes em `checking_pending`. Dispara webhooks tal como em produção."
          }
        },
        {
          "name": "[Sandbox] documented → at_pudo (devoluções)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{jwtToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/orders/rtn-set-at-pudo",
              "host": ["{{baseUrl}}"],
              "path": ["orders", "rtn-set-at-pudo"]
            },
            "description": "⚠️ Apenas Sandbox. Simula cliente a entregar devolução na loja. Afeta ordens `rtn`/`ndr` em `documented`."
          }
        },
        {
          "name": "[Sandbox] at_pudo → collected",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{jwtToken}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/orders/set-collected",
              "host": ["{{baseUrl}}"],
              "path": ["orders", "set-collected"]
            },
            "description": "⚠️ Apenas Sandbox. Simula recolha final de todos os pacotes em `at_pudo`. Dispara webhooks tal como em produção."
          }
        }
      ]
    }
  ]
}
