"""
CoinMarketCap API Service
دریافت داده‌های لحظه‌ای ارزهای دیجیتال از CoinMarketCap
"""

import os
import requests
from datetime import datetime
from dotenv import load_dotenv

load_dotenv()


class CoinMarketCapService:
    """سرویس دریافت داده‌های ارزهای دیجیتال از CoinMarketCap API"""
    
    def __init__(self):
        self.api_key = os.getenv('COINMARKETCAP_API_KEY', '')
        self.base_url = "https://pro-api.coinmarketcap.com/v1"
        self.headers = {
            'X-CMC_PRO_API_KEY': self.api_key,
            'Accept': 'application/json'
        }
    
    def get_top_gainers(self, limit: int = 50, convert: str = 'USD') -> dict:
        """
        دریافت لیست ارزهای دیجیتال با بیشترین رشد قیمت در 24 ساعت
        
        Args:
            limit: تعداد ارزها (پیش‌فرض 50)
            convert: ارز پایه برای قیمت‌ها (پیش‌فرض USD)
        
        Returns:
            dict: لیست ارزها با اطلاعات کامل
        """
        if not self.api_key:
            return self._get_mock_data(limit)
        
        try:
            # دریافت لیست ارزها با قیمت‌های لحظه‌ای
            url = f"{self.base_url}/cryptocurrency/listings/latest"
            params = {
                'limit': limit,
                'convert': convert,
                'sort': 'percent_change_24h',
                'sort_dir': 'desc'
            }
            
            response = requests.get(url, headers=self.headers, params=params)
            data = response.json()
            
            if response.status_code == 200 and data.get('status', {}).get('error_code') == 0:
                return self._format_cmc_data(data['data'], convert)
            else:
                print(f"CMC API Error: {data.get('status', {}).get('error_message')}")
                return self._get_mock_data(limit)
                
        except Exception as e:
            print(f"Error fetching from CoinMarketCap: {e}")
            return self._get_mock_data(limit)
    
    def get_top_losers(self, limit: int = 50, convert: str = 'USD') -> dict:
        """
        دریافت لیست ارزهای دیجیتال با بیشترین کاهش قیمت در 24 ساعت
        
        Args:
            limit: تعداد ارزها
            convert: ارز پایه
        
        Returns:
            dict: لیست ارزها با اطلاعات کامل
        """
        if not self.api_key:
            return self._get_mock_data(limit)
        
        try:
            url = f"{self.base_url}/cryptocurrency/listings/latest"
            params = {
                'limit': limit,
                'convert': convert,
                'sort': 'percent_change_24h',
                'sort_dir': 'asc'
            }
            
            response = requests.get(url, headers=self.headers, params=params)
            data = response.json()
            
            if response.status_code == 200 and data.get('status', {}).get('error_code') == 0:
                return self._format_cmc_data(data['data'], convert)
            else:
                return self._get_mock_data(limit)
                
        except Exception as e:
            print(f"Error fetching from CoinMarketCap: {e}")
            return self._get_mock_data(limit)
    
    def get_crypto_info(self, symbol: str, convert: str = 'USD') -> dict:
        """دریافت اطلاعات یک ارز خاص"""
        if not self.api_key:
            return {}
        
        try:
            url = f"{self.base_url}/cryptocurrency/quotes/latest"
            params = {'symbol': symbol, 'convert': convert}
            response = requests.get(url, headers=self.headers, params=params)
            data = response.json()
            
            if response.status_code == 200 and data.get('status', {}).get('error_code') == 0:
                return self._format_cmc_data([data['data'][symbol]], convert)
            return {}
        except Exception as e:
            print(f"Error: {e}")
            return {}
    
    def _format_cmc_data(self, raw_data: list, convert: str = 'USD') -> dict:
        """فرمت کردن داده‌های خام CoinMarketCap"""
        cryptocurrencies = []
        
        for item in raw_data:
            quote = item.get('quote', {}).get(convert, {})
            
            crypto = {
                'id': item.get('id'),
                'name': item.get('name'),
                'symbol': item.get('symbol'),
                'slug': item.get('slug'),
                'rank': item.get('cmc_rank'),
                'price': round(quote.get('price', 0), 6),
                'price_change_24h': round(quote.get('percent_change_24h', 0), 2),
                'price_change_7d': round(quote.get('percent_change_7d', 0) if quote.get('percent_change_7d') else 0, 2),
                'volume_24h': quote.get('volume_24h', 0),
                'market_cap': quote.get('market_cap', 0),
                'market_cap_dominance': round((quote.get('market_cap', 0) / 1000000000000), 2),
                'circulating_supply': item.get('circulating_supply'),
                'total_supply': item.get('total_supply'),
                'max_supply': item.get('max_supply'),
                'last_updated': quote.get('last_updated'),
                'icon_url': f"https://s2.coinmarketcap.com/static/img/coins/64x64/{item.get('id')}.png"
            }
            cryptocurrencies.append(crypto)
        
        return {
            'cryptocurrencies': cryptocurrencies,
            'total_count': len(cryptocurrencies),
            'timestamp': datetime.now().isoformat(),
            'status': 'success'
        }
    
    def _get_mock_data(self, limit: int = 50) -> dict:
        """داده‌های شبیه‌سازی شده برای زمانی که API در دسترس نیست"""
        mock_cryptos = [
            {'name': 'Bitcoin', 'symbol': 'BTC', 'price': 68500, 'price_change_24h': 2.5, 'market_cap': 1350000000000, 'rank': 1, 'id': 1},
            {'name': 'Ethereum', 'symbol': 'ETH', 'price': 3800, 'price_change_24h': 3.2, 'market_cap': 456000000000, 'rank': 2, 'id': 1027},
            {'name': 'Solana', 'symbol': 'SOL', 'price': 175, 'price_change_24h': 5.8, 'market_cap': 78000000000, 'rank': 5, 'id': 5426},
            {'name': 'Binance Coin', 'symbol': 'BNB', 'price': 580, 'price_change_24h': 1.8, 'market_cap': 85000000000, 'rank': 4, 'id': 1839},
            {'name': 'XRP', 'symbol': 'XRP', 'price': 0.62, 'price_change_24h': -0.5, 'market_cap': 34000000000, 'rank': 6, 'id': 52},
            {'name': 'Cardano', 'symbol': 'ADA', 'price': 0.45, 'price_change_24h': 4.2, 'market_cap': 16000000000, 'rank': 8, 'id': 2010},
            {'name': 'Dogecoin', 'symbol': 'DOGE', 'price': 0.15, 'price_change_24h': 12.5, 'market_cap': 21500000000, 'rank': 9, 'id': 74},
            {'name': 'Polkadot', 'symbol': 'DOT', 'price': 7.2, 'price_change_24h': 3.1, 'market_cap': 9500000000, 'rank': 12, 'id': 6636},
            {'name': 'Polygon', 'symbol': 'MATIC', 'price': 0.85, 'price_change_24h': 6.7, 'market_cap': 8000000000, 'rank': 14, 'id': 3890},
            {'name': 'Litecoin', 'symbol': 'LTC', 'price': 85, 'price_change_24h': 1.2, 'market_cap': 6300000000, 'rank': 18, 'id': 2},
        ]
        
        cryptocurrencies = []
        for i, crypto in enumerate(mock_cryptos[:limit]):
            crypto['id'] = crypto.get('id', i + 1)
            crypto['icon_url'] = f"https://s2.coinmarketcap.com/static/img/coins/64x64/{crypto['id']}.png"
            cryptocurrencies.append(crypto)
        
        return {
            'cryptocurrencies': cryptocurrencies,
            'total_count': len(cryptocurrencies),
            'timestamp': datetime.now().isoformat(),
            'status': 'success',
            'is_mock': True
        }


# نمونه استفاده
if __name__ == "__main__":
    service = CoinMarketCapService()
    gainers = service.get_top_gainers(limit=20)
    for crypto in gainers['cryptocurrencies'][:5]:
        print(f"{crypto['name']} ({crypto['symbol']}): ${crypto['price']} | {crypto['price_change_24h']}% | Market Cap: ${crypto['market_cap']:,.0f}")