import requests
import json
import os

# Менеджер для хранения токенов и куки с возможностью переключения между ними
class AuthManager:
    def __init__(self, config_path='auth_config.json'):
        self.config_path = config_path
        self.config = self.load_config()
        self.current_profile_name = None

    def load_config(self):
        # Если конфигурационный файл отсутствует, создать его с пустой структурой
        if not os.path.exists(self.config_path):
            config = {
                'profiles': {}
            }
            self.save_config(config)
            print(f"Файл конфигурации '{self.config_path}' создан. Пожалуйста, добавьте профили с 'X-Auth-Token', 'Cookie' и 'Authorization'.")
            exit(1)
        else:
            with open(self.config_path, 'r', encoding='utf-8') as f:
                return json.load(f)

    def save_config(self, config=None):
        if config is not None:
            self.config = config
        with open(self.config_path, 'w', encoding='utf-8') as f:
            json.dump(self.config, f, ensure_ascii=False, indent=4)

    def add_profile(self, name, x_auth_token, cookie, authorization):
        self.config['profiles'][name] = {
            'X-Auth-Token': x_auth_token,
            'Cookie': cookie,
            'Authorization': authorization
        }
        self.save_config()

    def set_current_profile(self, name):
        if name in self.config['profiles']:
            self.current_profile_name = name
        else:
            print(f"Профиль с именем '{name}' не найден.")
            exit(1)

    def get_current_profile(self):
        if self.current_profile_name is None:
            print("Текущий профиль не установлен. Пожалуйста, установите текущий профиль методом set_current_profile(name).")
            exit(1)
        return self.config['profiles'][self.current_profile_name]

    def get_x_auth_token(self):
        profile = self.get_current_profile()
        return profile.get('X-Auth-Token', '')

    def get_cookie(self):
        profile = self.get_current_profile()
        return profile.get('Cookie', '')

    def get_authorization(self):
        profile = self.get_current_profile()
        return profile.get('Authorization', '')

    def list_profiles(self):
        return list(self.config['profiles'].keys())

# Инициализация менеджера аутентификации
auth_manager = AuthManager()

# Проверка наличия профилей
profiles = auth_manager.list_profiles()
if not profiles:
    print("Нет доступных профилей. Пожалуйста, добавьте профили в 'auth_config.json' или с помощью метода add_profile.")
    # Пример добавления профилей
    # auth_manager.add_profile('profile_name', 'X-Auth-Token-значение', 'Cookie-значение', 'Authorization-значение')
    exit(1)
else:
    print("Доступные профили:")
    for profile_name in profiles:
        print(f"- {profile_name}")

# Установка текущего профиля
current_profile = input("Введите имя профиля для использования: ").strip()
auth_manager.set_current_profile(current_profile)

# Определяем заголовки
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                  'AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0',
    'Accept': 'application/json, text/plain, */*',
    'Accept-Encoding': 'gzip, deflate, br, zstd',
    'X-Auth-Token': auth_manager.get_x_auth_token(),
    'Authorization': auth_manager.get_authorization(),
    'sec-ch-ua-platform': '"Windows"',
    'sec-ch-ua': '"Microsoft Edge";v="129", "Not=A?Brand";v="8", "Chromium";v="129", "Microsoft Edge WebView2";v="129"',
    'sec-ch-ua-mobile': '?0',
    'Origin': 'https://snickers.ru',
    'Sec-Fetch-Site': 'same-origin',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Dest': 'empty',
    'Referer': 'https://snickers.ru/webapp/?v=2',
    'Accept-Language': 'ru,en;q=0.9,en-GB;q=0.8,en-US;q=0.7',
    'Cookie': auth_manager.get_cookie(),
}

# URL для получения списка городов
cities_url = 'https://snickers.ru/backend/api/cities'

# Отправляем GET-запрос для получения городов
response = requests.get(cities_url, headers=headers)

# Проверяем статус код ответа
if response.status_code != 200:
    print(f"Не удалось получить города. Статус код: {response.status_code}")
    exit(1)

# Парсим JSON ответ
cities_json = response.json()

# Проверяем успешность запроса
if not cities_json.get("result"):
    print("Не удалось получить данные городов.")
    exit(1)

# Получаем список городов
cities = cities_json.get("data", [])

# URL для отправки опроса (survey)
survey_url = 'https://snickers.ru/backend/api/survey'
discount_url = 'https://snickers.ru/backend/api/discount'

# Итерация по каждому городу
for city in cities:
    city_id = city.get("id")
    city_name = city.get("name")
    if not city_id:
        continue  # Пропускаем, если нет ID

    # Формируем данные для формы
    # Замените 'your_g_recaptcha_response' на актуальный g-recaptcha-response
    files = [
        ('city_id', (None, str(city_id))),
        ('type', (None, '1')),
        ('g-recaptcha-response', (None, 'your_g_recaptcha_response')),
        ('answers[]', (None, '1')),
        ('answers[]', (None, '1')),
        ('answers[]', (None, '1')),
        ('answers[]', (None, '1')),
    ]

    try:
        # Отправляем POST-запрос на опрос
        survey_response = requests.post(survey_url, headers=headers, files=files)

        # Проверяем статус код ответа
        if survey_response.status_code != 200:
            print(f"Не удалось отправить опрос для города {city_name} (ID: {city_id}). Статус код: {survey_response.status_code}")
            continue

        # Парсим JSON ответ
        survey_json = survey_response.json()

        # Получаем значение discount из ответа
        discount = survey_json.get("data", {}).get("discount")
        print(f"Скидка для города {city_name}: {discount}%")

        if  discount == 90 or discount == 80:
            print(f"Город: {city_name} (ID: {city_id}) имеет скидку: {discount}%")
            # Отправляем запрос на получение дисконта
            discount_response = requests.post(discount_url, headers=headers, files=files, timeout=3)
            print(f"Ответ на запрос дисконта для города {city_name}: {discount_response.json()}")

    except Exception as e:
        print(f"Ошибка при обработке города {city_name} (ID: {city_id}): {e}")

# После обработки всех городов можно добавить дополнительные действия