from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
from typing import List, Dict

class InlineKeyboards:
    """
    Inline keyboard'lar uchun klass
    """
    
    @staticmethod
    def main_menu(language: str = 'uz') -> InlineKeyboardMarkup:
        """
        Asosiy menyu
        """
        texts = {
            'uz': {
                'search': '🔍 Qidiruv',
                'top': '🔥 TOP qo\'shiqlar',
                'history': '📝 Tarix',
                'favorites': '❤️ Sevimlilar',
                'settings': '⚙️ Sozlamalar'
            },
            'ru': {
                'search': '🔍 Поиск',
                'top': '🔥 ТОП песни',
                'history': '📝 История',
                'favorites': '❤️ Избранное',
                'settings': '⚙️ Настройки'
            },
            'en': {
                'search': '🔍 Search',
                'top': '🔥 TOP songs',
                'history': '📝 History',
                'favorites': '❤️ Favorites',
                'settings': '⚙️ Settings'
            }
        }
        
        text = texts.get(language, texts['uz'])
        
        keyboard = InlineKeyboardMarkup(inline_keyboard=[
            [
                InlineKeyboardButton(text=text['search'], callback_data='search'),
                InlineKeyboardButton(text=text['top'], callback_data='top_songs')
            ],
            [
                InlineKeyboardButton(text=text['history'], callback_data='history'),
                InlineKeyboardButton(text=text['favorites'], callback_data='favorites')
            ],
            [
                InlineKeyboardButton(text=text['settings'], callback_data='settings')
            ]
        ])
        
        return keyboard
    
    @staticmethod
    def search_menu(language: str = 'uz') -> InlineKeyboardMarkup:
        """
        Qidiruv menyu
        """
        texts = {
            'uz': {
                'text': '✍️ Matn orqali',
                'audio': '🎵 Audio orqali',
                'back': '◀️ Ortga'
            },
            'ru': {
                'text': '✍️ По тексту',
                'audio': '🎵 По аудио',
                'back': '◀️ Назад'
            },
            'en': {
                'text': '✍️ By text',
                'audio': '🎵 By audio',
                'back': '◀️ Back'
            }
        }
        
        text = texts.get(language, texts['uz'])
        
        keyboard = InlineKeyboardMarkup(inline_keyboard=[
            [
                InlineKeyboardButton(text=text['text'], callback_data='search_text'),
                InlineKeyboardButton(text=text['audio'], callback_data='search_audio')
            ],
            [
                InlineKeyboardButton(text=text['back'], callback_data='main_menu')
            ]
        ])
        
        return keyboard
    
    @staticmethod
    def songs_list(songs: List[Dict], page: int = 0, language: str = 'uz') -> InlineKeyboardMarkup:
        """
        Qo'shiqlar ro'yxati
        """
        texts = {
            'uz': {
                'download': '⬇️ Yuklash',
                'preview': '▶️ Tinglash',
                'details': '📝 Tafsilot',
                'prev': '◀️',
                'next': '▶️',
                'back': '◀️ Ortga'
            },
            'ru': {
                'download': '⬇️ Скачать',
                'preview': '▶️ Слушать',
                'details': '📝 Подробно',
                'prev': '◀️',
                'next': '▶️',
                'back': '◀️ Назад'
            },
            'en': {
                'download': '⬇️ Download',
                'preview': '▶️ Listen',
                'details': '📝 Details',
                'prev': '◀️',
                'next': '▶️',
                'back': '◀️ Back'
            }
        }
        
        text = texts.get(language, texts['uz'])
        
        keyboard_buttons = []
        
        # Har bir qo'shiq uchun tugma
        songs_per_page = 5
        start_idx = page * songs_per_page
        end_idx = min(start_idx + songs_per_page, len(songs))
        
        for i in range(start_idx, end_idx):
            song = songs[i]
            song_text = f"🎵 {song['artist']} - {song['title']}"
            if len(song_text) > 50:
                song_text = song_text[:47] + "..."
            
            keyboard_buttons.append([
                InlineKeyboardButton(
                    text=song_text, 
                    callback_data=f"song_details:{song['id']}"
                )
            ])
        
        # Sahifalash tugmalari
        nav_buttons = []
        if page > 0:
            nav_buttons.append(
                InlineKeyboardButton(text=text['prev'], callback_data=f"page:{page-1}")
            )
        if end_idx < len(songs):
            nav_buttons.append(
                InlineKeyboardButton(text=text['next'], callback_data=f"page:{page+1}")
            )
        
        if nav_buttons:
            keyboard_buttons.append(nav_buttons)
        
        # Ortga tugmasi
        keyboard_buttons.append([
            InlineKeyboardButton(text=text['back'], callback_data='main_menu')
        ])
        
        return InlineKeyboardMarkup(inline_keyboard=keyboard_buttons)
    
    @staticmethod
    def song_details(song_id: str, is_favorite: bool = False, language: str = 'uz') -> InlineKeyboardMarkup:
        """
        Qo'shiq tafsilotlari
        """
        texts = {
            'uz': {
                'download': '⬇️ Yuklash',
                'preview': '▶️ Tinglash',
                'add_favorite': '❤️ Sevimlilar',
                'remove_favorite': '💔 Olib tashlash',
                'back': '◀️ Ortga'
            },
            'ru': {
                'download': '⬇️ Скачать',
                'preview': '▶️ Слушать',
                'add_favorite': '❤️ В избранное',
                'remove_favorite': '💔 Удалить',
                'back': '◀️ Назад'
            },
            'en': {
                'download': '⬇️ Download',
                'preview': '▶️ Listen',
                'add_favorite': '❤️ Add favorite',
                'remove_favorite': '💔 Remove',
                'back': '◀️ Back'
            }
        }
        
        text = texts.get(language, texts['uz'])
        
        favorite_text = text['remove_favorite'] if is_favorite else text['add_favorite']
        favorite_action = 'remove_favorite' if is_favorite else 'add_favorite'
        
        keyboard = InlineKeyboardMarkup(inline_keyboard=[
            [
                InlineKeyboardButton(text=text['download'], callback_data=f'download:{song_id}'),
                InlineKeyboardButton(text=text['preview'], callback_data=f'preview:{song_id}')
            ],
            [
                InlineKeyboardButton(text=favorite_text, callback_data=f'{favorite_action}:{song_id}')
            ],
            [
                InlineKeyboardButton(text=text['back'], callback_data='search_results')
            ]
        ])
        
        return keyboard
    
    @staticmethod
    def download_quality(song_id: str, language: str = 'uz') -> InlineKeyboardMarkup:
        """
        Yuklash sifati
        """
        texts = {
            'uz': {
                'quality': 'Sifatni tanlang:',
                'back': '◀️ Ortga'
            },
            'ru': {
                'quality': 'Выберите качество:',
                'back': '◀️ Назад'
            },
            'en': {
                'quality': 'Choose quality:',
                'back': '◀️ Back'
            }
        }
        
        text = texts.get(language, texts['uz'])
        
        keyboard = InlineKeyboardMarkup(inline_keyboard=[
            [
                InlineKeyboardButton(text='128 kbps', callback_data=f'dl_quality:{song_id}:128'),
                InlineKeyboardButton(text='192 kbps', callback_data=f'dl_quality:{song_id}:192'),
                InlineKeyboardButton(text='320 kbps', callback_data=f'dl_quality:{song_id}:320')
            ],
            [
                InlineKeyboardButton(text=text['back'], callback_data=f'song_details:{song_id}')
            ]
        ])
        
        return keyboard
    
    @staticmethod
    def settings_menu(language: str = 'uz') -> InlineKeyboardMarkup:
        """
        Sozlamalar menyu
        """
        texts = {
            'uz': {
                'language': '🌐 Til',
                'quality': '🎵 Sifat',
                'premium': '💎 Premium',
                'back': '◀️ Ortga'
            },
            'ru': {
                'language': '🌐 Язык',
                'quality': '🎵 Качество',
                'premium': '💎 Премиум',
                'back': '◀️ Назад'
            },
            'en': {
                'language': '🌐 Language',
                'quality': '🎵 Quality',
                'premium': '💎 Premium',
                'back': '◀️ Back'
            }
        }
        
        text = texts.get(language, texts['uz'])
        
        keyboard = InlineKeyboardMarkup(inline_keyboard=[
            [
                InlineKeyboardButton(text=text['language'], callback_data='settings_language'),
                InlineKeyboardButton(text=text['quality'], callback_data='settings_quality')
            ],
            [
                InlineKeyboardButton(text=text['premium'], callback_data='settings_premium')
            ],
            [
                InlineKeyboardButton(text=text['back'], callback_data='main_menu')
            ]
        ])
        
        return keyboard
    
    @staticmethod
    def language_settings(current_lang: str = 'uz') -> InlineKeyboardMarkup:
        """
        Til sozlamalari
        """
        languages = {
            'uz': '🇺🇿 O\'zbek',
            'ru': '🇷🇺 Русский',
            'en': '🇺🇸 English'
        }
        
        back_texts = {
            'uz': '◀️ Ortga',
            'ru': '◀️ Назад',
            'en': '◀️ Back'
        }
        
        keyboard_buttons = []
        for lang_code, lang_name in languages.items():
            if lang_code == current_lang:
                lang_name = f"✅ {lang_name}"
            
            keyboard_buttons.append([
                InlineKeyboardButton(text=lang_name, callback_data=f'set_language:{lang_code}')
            ])
        
        keyboard_buttons.append([
            InlineKeyboardButton(text=back_texts.get(current_lang, back_texts['uz']), callback_data='settings')
        ])
        
        return InlineKeyboardMarkup(inline_keyboard=keyboard_buttons)
    
    @staticmethod
    def quality_settings(current_quality: str = '192', language: str = 'uz') -> InlineKeyboardMarkup:
        """
        Sifat sozlamalari
        """
        texts = {
            'uz': {
                'back': '◀️ Ortga',
                'fast': 'Tez',
                'standard': 'Standart', 
                'high': 'Yuqori'
            },
            'ru': {
                'back': '◀️ Назад',
                'fast': 'Быстро',
                'standard': 'Стандарт',
                'high': 'Высокое'
            },
            'en': {
                'back': '◀️ Back',
                'fast': 'Fast',
                'standard': 'Standard',
                'high': 'High'
            }
        }
        
        text = texts.get(language, texts['uz'])
        
        qualities = {
            '128': f'128 kbps ({text["fast"]})',
            '192': f'192 kbps ({text["standard"]})',
            '320': f'320 kbps ({text["high"]})'
        }
        
        keyboard_buttons = []
        for quality_code, quality_name in qualities.items():
            if quality_code == current_quality:
                quality_name = f"✅ {quality_name}"
            
            keyboard_buttons.append([
                InlineKeyboardButton(text=quality_name, callback_data=f'set_quality:{quality_code}')
            ])
        
        keyboard_buttons.append([
            InlineKeyboardButton(text=text['back'], callback_data='settings')
        ])
        
        return InlineKeyboardMarkup(inline_keyboard=keyboard_buttons)