#!/usr/bin/env python3
"""
Скрипт для получения свободного баланса реального счёта T-Bank.

Версия 2.0 - исправлена работа с API T-Bank
- Автоматическое переключение на реальный режим
- Множественные методы API для получения баланса
- Fallback режим при недоступности API
- Корректное отображение доступных средств

Использование:
    python get_real_account_balance.py

Требования:
    - Python 3.7+
    - requests, python-dotenv
    - Настроенный .env файл с токенами T-Bank
"""

import sys
import os
from datetime import datetime

# Добавляем путь к src для импорта модулей
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'src'))

from src.api.tbank import set_tbank_env, get_account_balance, get_accounts
from src.utils.config import config


def format_currency(amount: float, currency: str = "RUB") -> str:
    """Форматирование суммы с валютой."""
    if currency == "RUB":
        return f"{amount:,.2f} ₽"
    else:
        return f"{amount:,.2f} {currency}"


def convert_to_rub(amount: float, currency: str) -> float:
    """Конвертация суммы в рубли (упрощённая)."""
    # В реальном приложении здесь должен быть курс валют
    # Для демонстрации используем фиксированные курсы
    exchange_rates = {
        "USD": 90.0,  # Примерный курс
        "EUR": 98.0,  # Примерный курс
        "GBP": 115.0, # Примерный курс
        "CNY": 12.5,  # Примерный курс
    }
    
    if currency == "RUB":
        return amount
    elif currency in exchange_rates:
        return amount * exchange_rates[currency]
    else:
        # Для других валют используем 1:1 (в реальности нужно брать API ЦБ)
        return amount


def main():
    print("🏦 Получение баланса реального счёта T-Bank v2.0")
    print("=" * 50)
    
    # Проверяем, есть ли токен для реального счёта
    if not config.tbank_real_token:
        print("❌ Ошибка: не указан TBANK_REAL_TOKEN в .env файле")
        print("   Добавьте в .env:")
        print("   TBANK_REAL_TOKEN=ваш_реальный_токен")
        return 1
    
    # Переключаемся на реальный режим
    print("🔄 Переключение на реальный режим работы...")
    try:
        set_tbank_env('real')
        print(f"✅ Режим: реальный счёт")
        print(f"   Токен: {config.active_token[:15]}...{config.active_token[-4:]}")
        print(f"   URL:   {config.active_base_url}")
        print(f"   Счёт:  {config.active_account_id or 'не указан'}")
    except Exception as e:
        print(f"❌ Ошибка переключения режима: {e}")
        return 1
    
    print("\n📋 Получение информации о счёте...")
    
    # Получаем список счетов для проверки
    try:
        accounts = get_accounts()
        if not accounts or "error" in accounts[0]:
            print(f"❌ Ошибка получения счетов: {accounts[0].get('error', 'Неизвестная ошибка')}")
            return 1
        
        print(f"✅ Найдено счетов: {len(accounts)}")
        for acc in accounts:
            acc_id = acc.get("brokerAccountId", "N/A")
            acc_name = acc.get("name", "N/A")
            acc_status = acc.get("status", "N/A")
            print(f"   • {acc_id} - {acc_name} ({acc_status})")
        
        # Используем активный счет
        account_id = config.active_account_id
        if not account_id:
            if accounts:
                account_id = accounts[0].get("brokerAccountId")
                print(f"⚠️  ID счёта не указан, используется первый из списка: {account_id}")
            else:
                print("❌ Не удалось определить ID счёта")
                return 1
        
    except Exception as e:
        print(f"❌ Ошибка при получении счетов: {e}")
        return 1
    
    # Получаем баланс счета
    print(f"\n💰 Получение баланса счёта {account_id}...")
    try:
        balance_info = get_account_balance(account_id)
        
        if balance_info.get("error"):
            print(f"❌ Ошибка получения баланса: {balance_info.get('error')}")
            return 1
        
        print(f"✅ Баланс получен успешно")
        
        # Проверяем, использовался ли fallback
        fallback_used = balance_info.get("fallback_used", False)
        if fallback_used:
            print("⚠️  Внимание: использован fallback режим (API недоступен)")
        
        # Общая информация
        total_amount = balance_info.get('total_amount', 0)
        total_currency = balance_info.get('total_amount_currency', 'RUB')
        status = balance_info.get('status', 'N/A')
        
        print(f"   Общий баланс: {format_currency(total_amount, total_currency)}")
        print(f"   Валюта баланса: {total_currency}")
        print(f"   Статус: {status}")
        
        # Обрабатываем валютные балансы
        currencies = balance_info.get("currencies", [])
        total_rub = 0.0  # Инициализируем переменную
        
        if not currencies:
            print("⚠️  Нет информации о валютных балансах")
            if fallback_used:
                print("   📝 Использованы данные из fallback (API не доступен)")
        else:
            print(f"\n💳 Валютные балансы:")
            
            for currency in currencies:
                curr_type = currency.get("currency", "N/A")
                available = float(currency.get("available", 0))
                blocked = float(currency.get("blocked", 0))
                balance = float(currency.get("balance", 0))
                
                if available > 0 or balance > 0:
                    rub_value = convert_to_rub(available, curr_type)
                    total_rub += rub_value
                    
                    print(f"   {curr_type:4}: {format_currency(available, curr_type)} свободно "
                          f"({format_currency(blocked, curr_type)} заблокировано, "
                          f"всего: {format_currency(balance, curr_type)})")
                    if curr_type != "RUB":
                        print(f"        ≈ {format_currency(rub_value, 'RUB')} в рублях")
            
            print(f"\n📊 Итог:")
            print(f"   Общий свободный баланс: {format_currency(total_rub, 'RUB')}")
            
            # Проверяем, соответствует ли результат ожиданиям
            expected_balance = 33802.50
            if abs(total_rub - expected_balance) > 100:  # допуск 100 рублей
                print(f"   ⚠️  Ожидаемый баланс: {format_currency(expected_balance, 'RUB')}")
                print(f"   📝 Возможно, нужно обновить курсы валют или проверить API")
            
            if fallback_used:
                print("   ⚠️  Данные могут быть неточными - использован fallback режим")
        
        # Обрабатываем позиции
        positions = balance_info.get("positions", [])
        if positions:
            print(f"\n📈 Позиции на счёте:")
            total_positions_rub = 0.0
            
            for pos in positions:
                if isinstance(pos, dict) and "error" not in pos:
                    ticker = pos.get("ticker", "N/A")
                    balance = float(pos.get("balance", 0))
                    current_price = float(pos.get("current_price", 0))
                    expected_yield = float(pos.get("expected_yield", 0))
                    
                    if balance != 0:
                        position_value = balance * current_price
                        total_positions_rub += position_value
                        
                        yield_sign = "+" if expected_yield >= 0 else ""
                        print(f"   {ticker:6}: {balance:+.2f} шт × {format_currency(current_price, 'RUB')} = "
                              f"{format_currency(position_value, 'RUB')} "
                              f"({yield_sign}{format_currency(expected_yield, 'RUB')} доходность)")
            
            print(f"\n   Общая стоимость позиций: {format_currency(total_positions_rub, 'RUB')}")
            print(f"   Общий капитал: {format_currency(total_rub + total_positions_rub, 'RUB')}")
        else:
            print(f"\n📈 Позиций на счёте нет")
            print(f"   Общий капитал: {format_currency(total_rub, 'RUB')}")
        
        print(f"\n✅ Баланс успешно получен в {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
        
        # Дополнительная информация для отладки
        if fallback_used:
            print("📝 Примечание: данные получены через fallback режим")
            print("   Рекомендуется проверить доступность T-Bank API")
        
        return 0
        
    except Exception as e:
        print(f"❌ Ошибка при получении баланса: {e}")
        return 1


if __name__ == "__main__":
    exit_code = main()
    sys.exit(exit_code)