# -*- coding: utf-8 -*-
"""
WBDown API Client
Готовый класс для работы с API WbDown (Wildberries)
Документация: https://wbdown.ru/api
Требуется: pip install requests
"""

import requests
from typing import Any, Dict, Optional


class WbDownApiClient:
    """Клиент API WbDown."""

    def __init__(
        self,
        api_key: str,
        base_url: str = "https://wbdown.ru/api/send",
        use_header_auth: bool = True,
    ):
        """
        :param api_key: API ключ
        :param base_url: Базовый URL API
        :param use_header_auth: True — ключ в заголовке X-API-Key, False — в параметре api_key
        """
        self.api_key = api_key
        self.base_url = base_url.rstrip("?&")
        self.use_header_auth = use_header_auth
        self._session = requests.Session()
        if use_header_auth:
            self._session.headers["X-API-Key"] = api_key
        self._session.headers["Accept"] = "application/json"

    def _request(self, params: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
        """Выполнить GET-запрос к API."""
        params = params or {}
        if not self.use_header_auth:
            params["api_key"] = self.api_key
        try:
            r = self._session.get(self.base_url, params=params, timeout=30)
            r.raise_for_status()
            return r.json()
        except requests.RequestException as e:
            return {"success": False, "error": str(e)}
        except ValueError:
            return {"success": False, "error": "Invalid JSON", "raw": r.text}

    def get_categories(self) -> Dict[str, Any]:
        """Получение дерева категорий каталога Wildberries."""
        return self._request({"action": "categories"})

    def get_category_products(
        self,
        path: str,
        page: int = 1,
        sort: str = "popular",
        limit: int = 0,
    ) -> Dict[str, Any]:
        """
        Список товаров по категории.
        :param path: Путь категории (например: elektronika/televizory-i-cifrovoe-tv)
        :param page: Номер страницы
        :param sort: popular|priceup|pricedown|rate|date
        :param limit: 0 = без ограничения
        """
        params = {
            "action": "category_products",
            "path": path,
            "page": page,
            "sort": sort,
        }
        if limit > 0:
            params["limit"] = limit
        return self._request(params)

    def get_supplier_articles(
        self,
        supplier_id: str,
        page: int = 1,
        sort: str = "popular",
        limit: int = 0,
    ) -> Dict[str, Any]:
        """
        Поиск товаров продавца по ID.
        :param supplier_id: ID продавца на Wildberries
        """
        params = {
            "action": "supplier_articles",
            "supplier_id": supplier_id,
            "page": page,
            "sort": sort,
        }
        if limit > 0:
            params["limit"] = limit
        return self._request(params)

    def keyword_search(
        self,
        query: str,
        page: int = 1,
        sort: str = "popular",
        limit: int = 10,
    ) -> Dict[str, Any]:
        """
        Поиск товаров по ключевым словам.
        :param query: Поисковый запрос
        """
        return self._request({
            "action": "keyword_search",
            "query": query,
            "page": page,
            "sort": sort,
            "limit": limit,
        })

    def get_reviews(self, art_id: str) -> Dict[str, Any]:
        """
        Получение отзывов с фотографиями по артикулу товара.
        :param art_id: Артикул товара на Wildberries
        """
        return self._request({"action": "reviews", "art_id": art_id})


# Пример использования:
# if __name__ == "__main__":
#     client = WbDownApiClient(api_key="ваш_api_ключ")
#     print(client.get_categories())
#     print(client.keyword_search("ноутбук"))
#     print(client.get_reviews("12345678"))
