﻿import streamlit as st
import os
import json
import random
import time
import hashlib
import uuid
from datetime import datetime

# ==========================================
# ГЛОБАЛЬНАЯ ЗОНА (БИЗНЕС-ЛОГИКА И КОНСТАНТЫ)
# ==========================================

DIR_PATH = os.path.dirname(__file__)
PREDICTIONS_FILE = os.path.join(DIR_PATH, "predictions.json")
SETTINGS_FILE = os.path.join(DIR_PATH, "settings.json")

DEFAULT_PREDICTIONS = [
    "Сегодня вас ждет неожиданная радость.", "Будьте осторожны с новыми начинаниями сегодня.", "Старый друг напомнит о себе.", 
    "Вас ждет финансовый сюрприз.", "Отличный день для саморазвития.", "Обратите внимание на знаки судьбы.", 
    "Ваша энергия сегодня на пике - используйте ее!", "Ожидайте приятных новостей к вечеру.", "Не бойтесь рисковать в малом.", 
    "Секрет вашего успеха сегодня — терпение.", "Кто-то тайно восхищается вами.", "Избегайте споров с коллегами.", 
    "Вас ждет удачная покупка.", "Случайная встреча изменит ваши планы.", "Посвятите вечер семье и близким.", 
    "Сегодняшний день принесет ясность в сложном вопросе.", "Ваша интуиция сегодня не подведет.", "Отличный момент для планирования отпуска.", 
    "Не отказывайтесь от предложенной помощи.", "Вас ждет романтический сюрприз.", "Смело делайте шаг навстречу мечте.", 
    "Сегодня лучше плыть по течению.", "Ваши старания скоро будут вознаграждены.", "Обратите внимание на здоровье.", 
    "Улыбка откроет перед вами все двери сегодня.", "Вас ждет интересное предложение по работе.", "Остерегайтесь необдуманных трат.", 
    "Вам предстоит важный разговор.", "Сегодня удача сопутствует смелым.", "Отпустите старые обиды.", 
    "Приятное знакомство не за горами.", "Уделите время своему хобби.", "Ваш труд принесет неожиданные плоды.", 
    "Сегодня возможны мелкие препятствия, но вы справитесь.", "Звезды советуют проявить настойчивость.", "Время расставит все по своим местам.", 
    "Вы на правильном пути, не сдавайтесь.", "Сегодня благоприятный день для обучения.", "Спонтанность — ваш лучший друг сегодня.", 
    "Будьте внимательны к деталям.", "Вас ждет уютный и спокойный вечер.", "Возможна внезапная поездка.", 
    "Ваша креативность сегодня на высоте.", "Не откладывайте важные дела на потом.", "Сегодня вас могут попросить о совете.", 
    "Пришло время навести порядок в мыслях.", "Хороший день для начала ремонта или перестановки.", "Доверяйте только проверенным фактам.", 
    "Удачный день для заключения сделок.", "Вам откроется небольшая тайна.", "Сосредоточьтесь на главном и отбросьте мелочи.", 
    "Сегодня кто-то нуждается в вашей поддержке.", "Ваш оптимизм заразителен.", "Смело меняйте имидж.", 
    "Возможны неожиданные гости.", "Звезды обещают гармонию в личной жизни.", "Сегодня стоит прислушаться к старшим.", 
    "Не бойтесь признавать свои ошибки.", "Вас ждет удача в творчестве.", "Обратите внимание на сны — они могут быть вещими.", 
    "Сегодня благоприятный день для инвестиций.", "Вам предстоит принять важное решение.", "Не торопите события.", 
    "Отличный день для занятий спортом.", "Кто-то готовит вам приятный сюрприз.", "Сегодня ваш день для побед.", 
    "Будьте щедрыми, и это вернется сторицей.", "Ожидайте похвалу от начальства.", "Вас ждет интересная находка.", 
    "Сегодня стоит отказаться от вредных привычек.", "Прислушайтесь к своему внутреннему голосу.", "Хороший день для медитации и отдыха.", 
    "Возможны небольшие разногласия, сохраняйте спокойствие.", "Ваша целеустремленность поразит окружающих.", "Счастье ближе, чем кажется.", 
    "Сегодня вам улыбнется фортуна.", "Не доверяйте слухам.", "Вам предстоит открыть для себя что-то новое.", 
    "Отличный момент для примирения.", "Ваш авторитет возрастет.", "Сегодняшний день принесет вам вдохновение.", 
    "Будьте открыты для новых идей.", "Вас ждет приятная беседа.", "Сегодня стоит проявить лидерские качества.", 
    "Не бойтесь просить о помощи.", "Вас ждет успех в командной работе.", "Сегодняшний вечер идеально подходит для чтения.", 
    "Ваш труд будет оценен по достоинству.", "Вам предстоит сделать важный выбор.", "Сегодня благоприятный день для покупок.", 
    "Вас ждет неожиданное приглашение.", "Сохраняйте позитивный настрой.", "Сегодня удачный день для смены обстановки.", 
    "Будьте внимательны за рулем или в дороге.", "Вам удастся решить давнюю проблему.", "Сегодняшний день полон сюрпризов.", 
    "Звезды советуют не спешить с выводами.", "Вас ждет теплая встреча.", "Сегодня отличный день для общения с природой.", 
    "Верьте в себя, и все получится!"
]

def init_files():
    """Создает файлы настроек и предсказаний, если они отсутствуют."""
    if not os.path.exists(PREDICTIONS_FILE):
        with open(PREDICTIONS_FILE, "w", encoding="utf-8") as f:
            json.dump(DEFAULT_PREDICTIONS, f, ensure_ascii=False, indent=4)
            
    if not os.path.exists(SETTINGS_FILE):
        with open(SETTINGS_FILE, "w", encoding="utf-8") as f:
            json.dump({}, f, ensure_ascii=False, indent=4)

def load_predictions():
    with open(PREDICTIONS_FILE, "r", encoding="utf-8") as f:
        return json.load(f)

def load_settings():
    with open(SETTINGS_FILE, "r", encoding="utf-8") as f:
        return json.load(f)

def save_settings(data):
    with open(SETTINGS_FILE, "w", encoding="utf-8") as f:
        json.dump(data, f, ensure_ascii=False, indent=4)

def get_current_date():
    return datetime.now().strftime("%Y-%m-%d")

def get_persistent_client_id():
    """
    Автоматическая идентификация пользователя без ручного ввода:
    1. Корпоративные заголовки аутентификации (SSO/Reverse Proxy).
    2. Цифровой отпечаток браузера (IP + User-Agent).
    3. Персистентный токен в URL.
    """
    try:
        headers = st.context.headers
        
        # Проверка корпоративного SSO
        sso_user = (
            headers.get("x-forwarded-user")
            or headers.get("remote-user")
            or headers.get("x-user")
        )
        if sso_user:
            return f"sso_{sso_user.strip()}"
            
        # Отпечаток браузера (IP + User-Agent)
        ip = headers.get("x-forwarded-for") or headers.get("x-real-ip") or ""
        if ip:
            ip = ip.split(",")[0].strip()
        user_agent = headers.get("user-agent", "")
        
        if ip or user_agent:
            raw_fingerprint = f"{ip}_{user_agent}"
            return "fp_" + hashlib.sha256(raw_fingerprint.encode()).hexdigest()[:16]
    except Exception:
        pass

    # Резервный механизм сохранения токена в адресной строке
    if "uid" in st.query_params:
        return f"token_{st.query_params['uid']}"

    new_uid = str(uuid.uuid4())[:8]
    st.query_params["uid"] = new_uid
    return f"token_{new_uid}"

# ==========================================
# ТОЧКА ВХОДА (ПОЛЬЗОВАТЕЛЬСКИЙ ИНТЕРФЕЙС)
# ==========================================

def run(plugin_info):
    init_files()
    
    with st.container(border=True):
        st.write(f"### {plugin_info.get('icon', '🔮')} {plugin_info.get('title', 'Предсказатор')}")
        st.write(plugin_info.get("full_description", ""))
        st.write("---")
        
        client_id = get_persistent_client_id()
        settings = load_settings()
        today = get_current_date()
        
        user_record = settings.get(client_id)
        already_received = bool(user_record and user_record.get("date") == today)
        
        if already_received:
            st.warning("⚠️ Звезды говорят с нами лишь раз в сутки! Вы уже получили свое предсказание на сегодня:")
            st.info(f"### 🔮 {user_record.get('prediction', '')}")
            st.caption("Возвращайтесь завтра за новым предсказанием.")
        else:
            if st.button("✨ Получить предсказание ✨", use_container_width=True):
                with st.spinner("Слушаем шепот звезд... Настраиваемся на вашу ауру..."):
                    time.sleep(2.5)
                
                predictions_list = load_predictions()
                chosen_prediction = random.choice(predictions_list)
                
                settings[client_id] = {
                    "date": today,
                    "prediction": chosen_prediction
                }
                save_settings(settings)
                
                st.balloons()
                st.success("🌟 **Ваше предсказание на сегодня:**")
                st.info(f"### 🔮 {chosen_prediction}")
                st.rerun()