openapi: 3.0.0
info:
  title: Product Assistant API
  version: "1.0"
paths:
  /auth/telegram:
    post:
      summary: Авторизация через Telegram
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TelegramAuthRequest'
      responses:
        '200':
          description: Успешная авторизация
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TelegramAuthResponse'
        '400':
          description: Ошибка авторизации

  /abstract-products:
    get:
      summary: Получить абстрактные продукты по ID категории
      parameters:
        - $ref: '#/components/parameters/CategoryId'
      responses:
        '200':
          description: Список абстрактных продуктов
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AbstractProductsResponse'
        '400':
          description: Неверный запрос

  /categories-tree:
    get:
      summary: Получить дерево категорий
      responses:
        '200':
          description: Иерархическое дерево категорий
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CategoriesTreeResponse'
        '500':
          description: Внутренняя ошибка сервера
        '400':
          description: Неверный запрос

  /get-abstract-product:
    get:
      summary: Получить информацию об абстрактном товаре по ID
      parameters:
        - $ref: '#/components/parameters/ProductId'
      responses:
        '200':
          description: Данные абстрактного товара
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetAbstractProductResponse'
        '400':
          description: Неверный запрос

  /get-parsed-products:
    get:
      summary: Получить список парсенных вариантов товара по ID абстрактного товара
      parameters:
        - $ref: '#/components/parameters/AbstractId'
      responses:
        '200':
          description: Список парсенных вариантов товара
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ParsedProductsResponse'
        '400':
          description: Неверный запрос

  /llm-request:
    post:
      summary: Запрос к LLM для подбора товаров
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LLMRequest'
      responses:
        '200':
          description: Результаты запроса к LLM
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LLMResponse'
        '400':
          description: Неверный запрос

  /favourites/add:
    post:
      summary: Добавить продукт в избранное
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FavouriteAddRequest'
      responses:
        '200':
          description: Продукт добавлен в избранное
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MessageResponse'
        '400':
          description: Неверный запрос

  /favourites/delete:
    delete:
      summary: Удалить продукт из избранного
      parameters:
        - $ref: '#/components/parameters/ProductId'
      responses:
        '200':
          description: Продукт удалён из избранного
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MessageResponse'
        '400':
          description: Неверный запрос

  /favourites/get:
    get:
      summary: Получить избранный продукт
      parameters:
        - $ref: '#/components/parameters/ProductId'
      responses:
        '200':
          description: Данные избранного продукта
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FavouriteGetResponse'
        '400':
          description: Неверный запрос

  /favourites/list:
    get:
      summary: Получить список избранных продуктов
      responses:
        '200':
          description: Список избранных продуктов
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FavouriteListResponse'
        '400':
          description: Неверный запрос

  /price-change:
    post:
      summary: Публикация уведомления об изменении цены
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PriceChangeRequest'
      responses:
        '200':
          description: Уведомление успешно опубликовано
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MessageResponse'
        '400':
          description: Некорректный запрос
        '500':
          description: Внутренняя ошибка сервера

components:
  parameters:
    CategoryId:
      name: category_id
      in: query
      required: true
      schema:
        type: string
      description: UUID категории
    ProductId:
      name: product_id
      in: query
      required: true
      schema:
        type: string
      description: UUID продукта
    AbstractId:
      name: abstractId
      in: query
      required: true
      schema:
        type: string
      description: UUID абстрактного товара

  schemas:
    TelegramAuthRequest:
      type: object
      required:
        - id
        - first_name
        - auth_date
        - hash
      properties:
        id:
          type: integer
        first_name:
          type: string
        last_name:
          type: string
        username:
          type: string
        photo_url:
          type: string
        auth_date:
          type: integer
        hash:
          type: string

    TelegramAuthResponse:
      type: object
      properties:
        token:
          type: string
        message:
          type: string

    AbstractProduct:
      type: object
      properties:
        id:
          type: string
        category_id:
          type: string
        name:
          type: string
        content:
          type: object
          additionalProperties: true
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
        min_price:
            type: number
            format: double
        photo_url:
            type: string

    AbstractProductsResponse:
      type: object
      properties:
        products:
          type: array
          items:
            $ref: '#/components/schemas/AbstractProduct'

    CategoryNode:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        children:
          type: array
          items:
            $ref: '#/components/schemas/CategoryNode'

    CategoriesTreeResponse:
      type: object
      properties:
        categories:
          type: array
          items:
            $ref: '#/components/schemas/CategoryNode'

    GetAbstractProductResponse:
      type: object
      properties:
        product:
          $ref: '#/components/schemas/AbstractProduct'

    ParsedProduct:
      type: object
      properties:
        id:
          type: string
        price:
          type: number
          format: double
        product_url:
          type: string
        market:
          type: string
        photo_urls:
          type: array
          items:
            type: string

    ParsedProductsResponse:
      type: object
      properties:
        parsedProducts:
          type: array
          items:
            $ref: '#/components/schemas/ParsedProduct'

    LLMRequest:
      type: object
      required:
        - query
      properties:
        query:
          type: string

    LLMResponse:
      type: object
      properties:
        comment:
          type: string
        products:
          type: array
          items:
            $ref: '#/components/schemas/AbstractProduct'

    FavouriteAddRequest:
      type: object
      required:
        - product_id
      properties:
        product_id:
          type: string

    FavouriteGetResponse:
      type: object
      properties:
        product:
          $ref: '#/components/schemas/AbstractProduct'

    FavouriteListResponse:
      type: object
      properties:
        favourites:
          type: array
          items:
            $ref: '#/components/schemas/AbstractProduct'

    PriceChangeRequest:
      type: object
      required:
        - productId
        - oldPrice
        - newPrice
      properties:
        productId:
          type: string
        oldPrice:
          type: integer
        newPrice:
          type: integer
        marketName:
          type: string

    MessageResponse:
      type: object
      properties:
        message:
          type: string
