import requests
import os
from tqdm import tqdm

def get_user_input():
    mc_version = input('Введите версию Minecraft (например, 1.20.1): ').strip()
    platform = input('Введите платформу (Forge или Fabric): ').strip().lower()
    description = input('Опишите желаемую сборку (ключевые слова): ').strip()
    return mc_version, platform, description

def search_mods(description, mc_version, platform):
    url = 'https://api.modrinth.com/v2/search'
    headers = {
        'User-Agent': 'ModPackBuilder/1.0 (+contact@yourdomain.com)'
    }
    params = {
        'query': description,
        'limit': 20,
    }
    facets = [
        [f"versions:{mc_version}"],
        [f"categories:{platform}"],
        ["project_type:mod"],
    ]
    import json
    params['facets'] = json.dumps(facets)

    response = requests.get(url, params=params, headers=headers)
    if response.status_code == 200:
        data = response.json()
        hits = data.get('hits', [])
        return hits
    else:
        print(f'Ошибка при запросе к API Modrinth. Статус код: {response.status_code}')
        print(f'Текст ошибки: {response.text}')
        return []

def display_mods(mods):
    print('\nПодобранные моды:')
    for idx, mod in enumerate(mods):
        print(f"{idx + 1}. {mod['title']} - {mod['description']}")
    print()

def modify_mod_list(mods):
    while True:
        action = input('Выберите действие: [1] Удалить мод, [2] Продолжить: ').strip()
        if action == '1':
            try:
                idx_to_remove = int(input('Введите номер мода для удаления: ')) - 1
                if 0 <= idx_to_remove < len(mods):
                    removed_mod = mods.pop(idx_to_remove)
                    print(f"Мод '{removed_mod['title']}' удалён из сбора.")
                    display_mods(mods)
                else:
                    print('Неверный номер мода.')
            except ValueError:
                print('Пожалуйста, введите корректный номер.')
        elif action == '2':
            break
        else:
            print('Неверный выбор действия.')

def get_latest_compatible_version(mod_id, mc_version):
    url = f'https://api.modrinth.com/v2/project/{mod_id}/version'
    headers = {
        'User-Agent': 'ModPackBuilder/1.0 (+contact@yourdomain.com)'
    }
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        versions = response.json()
        # Фильтруем версии по версии Minecraft
        versions = [v for v in versions if mc_version in v['game_versions']]
        if versions:
            # Возвращаем последнюю стабильную версию
            for version in versions:
                if version['version_type'] == 'release':
                    return version
            # Если нет стабильных версий, возвращаем первую доступную
            return versions[0]
    return None

def download_mods(mods, mc_version):
    if not os.path.exists('mods'):
        os.makedirs('mods')
    readme_lines = []
    for mod in mods:
        print(f"\nОбработка мода: {mod['title']}")
        version = get_latest_compatible_version(mod['project_id'], mc_version)
        if version:
            files = [file for file in version['files'] if file['primary']]
            if not files:
                files = version['files']
            if files:
                file_info = files[0]
                url = file_info['url']
                filename = file_info['filename']
                print(f"Скачивание {mod['title']} версии {version['version_number']}")
                download_file(url, 'mods', filename)
                # Добавляем информацию о моде в README
                mod_info = f"{mod['title']} - {mod['description']}\nСсылка: https://modrinth.com/mod/{mod['slug']}\n"
                readme_lines.append(mod_info)
            else:
                print('Нет доступных файлов для скачивания.')
        else:
            print(f"Не найдено совместимых версий для {mod['title']}.")

    # Создание README.txt
    with open('README.txt', 'w', encoding='utf-8') as f:
        f.write('Список установленных модов:\n\n')
        f.writelines('\n'.join(readme_lines))
    print('\nСборка завершена. Файл README.txt создан.')

def download_file(url, dest_folder, filename):
    local_filename = os.path.join(dest_folder, filename)
    headers = {
        'User-Agent': 'ModPackBuilder/1.0 (+contact@yourdomain.com)'
    }
    with requests.get(url, stream=True, headers=headers) as r:
        r.raise_for_status()
        total_size = int(r.headers.get('content-length', 0))
        with open(local_filename, 'wb') as f, tqdm(
            total=total_size, unit='iB', unit_scale=True, desc=filename
        ) as bar:
            for chunk in r.iter_content(chunk_size=8192):
                size = f.write(chunk)
                bar.update(size)
    return local_filename

def main():
    mc_version, platform, description = get_user_input()
    mods = search_mods(description, mc_version, platform)
    if not mods:
        print('Не удалось найти моды по заданным критериям.')
        return
    display_mods(mods)
    while True:
        choice = input('Вы удовлетворены подбором модов? [да/нет]: ').strip().lower()
        if choice == 'да':
            break
        elif choice == 'нет':
            modify_mod_list(mods)
        else:
            print('Пожалуйста, ответьте "да" или "нет".')

    download_mods(mods, mc_version)

if __name__ == '__main__':
    main()  
изучи