{
  "openapi": "3.1.0",
  "info": {
    "title": "UAB Testas e-parduotuvė API",
    "version": "1.0.0",
    "description": "Užsakymų API. Demonstracinė sistema per48h integracijos bandymams: duomenys netikri. Visos užklausos /api/* reikalauja antraštės `Authorization: Bearer <API raktas>`. Laikai UTC, ISO 8601 (`2026-10-05T08:00:00Z`). Sumos eurais, skaičiai su ne daugiau kaip 2 skaitmenimis po kablelio."
  },
  "servers": [{ "url": "https://p48demo-shop.per48h.lt" }],
  "security": [{ "bearer": [] }],
  "paths": {
    "/api/orders": {
      "get": {
        "operationId": "listOrders",
        "summary": "Užsakymų sąrašas",
        "description": "Grąžina užsakymus, sukurtus nuo `since` imtinai (`created_at >= since`), nuo seniausio. Jei `has_more` yra true, kartokite su `since` = paskutinio užsakymo `created_at` (tas pats užsakymas gali grįžti dar kartą: atpažinkite pagal `id`).",
        "parameters": [
          {
            "name": "since",
            "in": "query",
            "required": false,
            "description": "ISO 8601 data ir laikas. Be laiko juostos laikoma UTC. Nenurodžius: visi užsakymai.",
            "schema": { "type": "string", "format": "date-time" },
            "example": "2026-10-05T08:00:00Z"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Kiek daugiausia užsakymų grąžinti (1-500).",
            "schema": { "type": "integer", "minimum": 1, "maximum": 500, "default": 100 }
          }
        ],
        "responses": {
          "200": {
            "description": "Užsakymai",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": ["orders", "has_more"],
                  "properties": {
                    "orders": { "type": "array", "items": { "$ref": "#/components/schemas/Order" } },
                    "has_more": { "type": "boolean", "description": "Yra daugiau užsakymų už `limit`." }
                  }
                }
              }
            }
          },
          "400": { "$ref": "#/components/responses/Error" },
          "401": { "$ref": "#/components/responses/Error" }
        }
      },
      "post": {
        "operationId": "createOrder",
        "summary": "Sukurti užsakymą (bandymams)",
        "description": "Sukuria užsakymą, tarsi jį būtų pateikęs pirkėjas. `total` apskaičiuojamas: qty × unit_price eilučių suma.",
        "requestBody": {
          "required": true,
          "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NewOrder" } } }
        },
        "responses": {
          "201": {
            "description": "Sukurtas užsakymas",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Order" } } }
          },
          "400": { "$ref": "#/components/responses/Error" },
          "401": { "$ref": "#/components/responses/Error" },
          "422": { "$ref": "#/components/responses/Error" }
        }
      }
    },
    "/api/orders/{id}": {
      "get": {
        "operationId": "getOrder",
        "summary": "Vienas užsakymas",
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }],
        "responses": {
          "200": {
            "description": "Užsakymas",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Order" } } }
          },
          "401": { "$ref": "#/components/responses/Error" },
          "404": { "$ref": "#/components/responses/Error" }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearer": { "type": "http", "scheme": "bearer", "description": "API raktas, kurį išduoda parduotuvės administratorius." }
    },
    "schemas": {
      "Customer": {
        "type": "object",
        "required": ["name", "email"],
        "properties": {
          "name": { "type": "string", "maxLength": 200, "description": "Vardas, pavardė arba įmonės pavadinimas" },
          "email": { "type": "string", "format": "email" },
          "company_code": { "type": "string", "maxLength": 20, "description": "Įmonės kodas. Tik kai perka įmonė; privataus asmens užsakyme šio lauko nėra." }
        }
      },
      "Line": {
        "type": "object",
        "required": ["sku", "name", "qty", "unit_price"],
        "properties": {
          "sku": { "type": "string", "maxLength": 40 },
          "name": { "type": "string", "maxLength": 200 },
          "qty": { "type": "integer", "minimum": 1, "maximum": 10000 },
          "unit_price": { "type": "number", "minimum": 0, "description": "Vieneto kaina su PVM" }
        }
      },
      "Order": {
        "type": "object",
        "required": ["id", "number", "created_at", "customer", "lines", "total", "currency"],
        "properties": {
          "id": { "type": "integer" },
          "number": { "type": "string", "example": "EP-10001" },
          "created_at": { "type": "string", "format": "date-time", "example": "2026-10-05T08:15:02Z" },
          "customer": { "$ref": "#/components/schemas/Customer" },
          "lines": { "type": "array", "items": { "$ref": "#/components/schemas/Line" } },
          "total": { "type": "number", "description": "Suma su PVM" },
          "currency": { "type": "string", "example": "EUR" }
        }
      },
      "NewOrder": {
        "type": "object",
        "required": ["customer", "lines"],
        "properties": {
          "customer": { "$ref": "#/components/schemas/Customer" },
          "lines": { "type": "array", "minItems": 1, "maxItems": 50, "items": { "$ref": "#/components/schemas/Line" } },
          "currency": { "type": "string", "pattern": "^[A-Z]{3}$", "default": "EUR" }
        }
      },
      "Error": {
        "type": "object",
        "required": ["error", "message"],
        "properties": {
          "error": { "type": "string", "description": "Mašininis kodas: unauthorized, invalid_json, validation_failed, invalid_since, invalid_limit, not_found, ..." },
          "message": { "type": "string" },
          "details": { "type": "array", "items": { "type": "string" } }
        }
      }
    },
    "responses": {
      "Error": {
        "description": "Klaida",
        "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } }
      }
    }
  }
}
