import os
import json
import csv
import time
import requests # 用于实际的API调用和文件下载，需要手动安装: pip install requests

# --- 全局配置与数据结构 ---

# 默认配置
CONFIG = {
    'keyword': None,
    'language': 'zh',
    'limit': 10,
    'namespace': 0, # 0: 文章
}

# 保存配置
SAVE_CONFIG = {
    'include_full_text': True,
    'include_links_data': False,
    'media_action': 'links_only', # 'links_only' 或 'download_files'
    'format': 'JSON', # JSON, CSV, MD
    'path': './saved_results',
}

# 模拟搜索结果的结构
MOCK_RESULT = {
    'title': '人工智能',
    'summary': '人工智能（英语：Artificial Intelligence，缩写为 AI）...',
    'full_content': '这是完整的维基百科文章内容...',
    'full_url': 'https://zh.wikipedia.org/wiki/人工智能',
    'links': [
        {'anchor_text': '深度学习', 'url': 'https://zh.wikipedia.org/wiki/深度学习', 'type': 'Internal'},
        {'anchor_text': 'GitHub', 'url': 'https://www.github.com', 'type': 'External'}
    ],
    'media': [
        {'file_name': 'AI_Diagram.jpg', 'url': 'https://upload.wikimedia.org/wikipedia/commons/4/4b/Artificial_Intelligence.png', 'type': 'Image'}
    ]
}

current_results = [] # 存储当前搜索到的结果
history_files = []   # 存储已保存文件的列表

# --- 工具函数 ---

def clear_screen():
    """清空命令行屏幕 (在不同系统上使用不同的命令)"""
    os.system('cls' if os.name == 'nt' else 'clear')

def get_timestamp():
    """获取当前时间戳字符串"""
    return time.strftime("%Y%m%d_%H%M%S")

# --- 模拟 API 函数 (需要替换为真实实现) ---

def wikipedia_api_call(config):
    """
    [TODO] 真实的维基百科 API 调用函数。
    它应该根据 config['keyword'] 和 config['language'] 调用 MediaWiki API
    获取搜索结果列表，并对每个结果调用另一个 API 获取 full_content, links, media 等信息。
    """
    print(f"\n[INFO] 正在使用配置执行搜索: {config['keyword']} @ {config['language']}...")
    time.sleep(1) # 模拟网络延迟

    if not config['keyword']:
        print("[ERROR] 关键词不能为空。")
        return []

    # 模拟返回 5 条结果
    results = []
    for i in range(1, 6):
        res = MOCK_RESULT.copy()
        res['title'] = f"{config['keyword']} 结果 {i}"
        res['id'] = i
        results.append(res)
    
    print(f"[SUCCESS] 找到 {len(results)} 条结果。")
    return results

def download_media(media_list, save_dir):
    """
    [TODO] 真实的媒体文件下载函数。
    使用 requests 库下载文件到 save_dir。
    """
    downloaded_paths = []
    print(f"[INFO] 正在下载 {len(media_list)} 个媒体文件到 {save_dir}...")
    # for media_item in media_list:
    #     try:
    #         response = requests.get(media_item['url'], stream=True)
    #         file_path = os.path.join(save_dir, media_item['file_name'])
    #         with open(file_path, 'wb') as f:
    #             for chunk in response.iter_content(chunk_size=8192):
    #                 f.write(chunk)
    #         downloaded_paths.append(file_path)
    #     except Exception as e:
    #         print(f"[WARNING] 下载 {media_item['file_name']} 失败: {e}")
    time.sleep(1) # 模拟下载
    return downloaded_paths


# --- 保存格式化函数 (需要填充细节) ---

def format_to_json(data_list):
    """[TODO] 格式化为 JSON 字符串"""
    return json.dumps(data_list, ensure_ascii=False, indent=4)

def format_to_csv(data_list):
    """[TODO] 格式化为 CSV 字符串"""
    # 复杂: 需要决定如何处理 links 和 media 的嵌套结构
    # 简单处理: 只保留 title, url, summary
    keys = ['title', 'summary', 'full_url']
    if SAVE_CONFIG['include_links_data']:
        keys.append('links_count')
    
    csv_data = []
    # 构造 CSV 行
    # ...
    return "title,summary\n..."

def format_to_markdown(data_list):
    """[TODO] 格式化为 Markdown 字符串"""
    md = ""
    for item in data_list:
        md += f"# {item['title']}\n\n"
        md += f"{item['full_content']}\n"
        if SAVE_CONFIG['include_links_data']:
            md += "## 链接\n"
            for link in item.get('links', []):
                md += f"* [{link['anchor_text']}]({link['url']}) ({link['type']})\n"
        md += "---\n\n"
    return md

# --- 核心菜单函数 ---

def main_menu():
    """主菜单"""
    clear_screen()
    print("--- WikiCLI-Saver 主菜单 ---")
    print("1. 执行新的高级搜索")
    print("2. 查看/管理已保存结果")
    print("3. 帮助与关于")
    print("0. 退出程序")
    
    choice = input("请输入选项: ").strip()
    
    if choice == '1':
        search_config_menu()
    elif choice == '2':
        manage_menu()
    elif choice == '3':
        print("\n[INFO] WikiCLI-Saver 是一个用于维基百科高级搜索和数据保存的命令行工具。")
        input("按任意键返回主菜单...")
    elif choice == '0':
        print("\n[INFO] 感谢使用，程序已退出。")
        return False
    else:
        print("[ERROR] 无效选项，请重新输入。")
        time.sleep(1)
    
    return True

def search_config_menu():
    """2.1 搜索配置菜单"""
    global CONFIG, current_results
    while True:
        clear_screen()
        print("--- 2.1 搜索配置菜单 ---")
        print(f"1. 输入/修改搜索关键词 (必填): Current: {CONFIG['keyword'] or '未设置'}")
        print(f"2. 设置语言版本 (默认：zh): Current: {CONFIG['language']}")
        print(f"3. 限制结果数量 (默认：10): Current: {CONFIG['limit']} 条")
        print(f"4. 设置搜索类型 (命名空间): Current: {CONFIG['namespace']} (文章/主空间)")
        print("5. 执行搜索")
        print("0. 返回主菜单")

        choice = input("请输入选项: ").strip()

        if choice == '1':
            CONFIG['keyword'] = input("请输入搜索关键词: ").strip()
        elif choice == '2':
            CONFIG['language'] = input("请输入语言代码 (如: zh, en, de): ").strip().lower() or CONFIG['language']
        elif choice == '3':
            try:
                CONFIG['limit'] = int(input("请输入结果数量限制 (1-50): "))
            except ValueError:
                print("[ERROR] 请输入有效的数字。")
        elif choice == '4':
            CONFIG['namespace'] = input("请输入命名空间编号 (如 0, 6, 14): ").strip()
        elif choice == '5':
            if not CONFIG['keyword']:
                print("[ERROR] 请先设置搜索关键词。")
                time.sleep(1)
                continue
            
            current_results = wikipedia_api_call(CONFIG)
            if current_results:
                results_display_menu()
                break # 搜索结束后退出配置菜单
        elif choice == '0':
            break
        else:
            print("[ERROR] 无效选项，请重新输入。")
            time.sleep(1)

def results_display_menu():
    """2.2 结果展示与操作菜单"""
    global current_results
    if not current_results:
        print("[INFO] 当前没有搜索结果可展示。")
        return

    while True:
        clear_screen()
        print(f"--- 2.2 搜索结果 (共 {len(current_results)} 条) ---")
        for i, res in enumerate(current_results):
            print(f"[{i+1}]. {res['title']} ({res['summary'][:30]}...)")
        
        print("\n--- 操作 ---")
        print(" [数字]  - 查看指定结果的完整摘要")
        print(" S       - 保存当前搜索的全部结果")
        print(" P [1,2] - 保存指定的单个或多个结果 (如: P 1,5)")
        print(" R       - 重新配置搜索")
        print(" 0       - 返回主菜单")
        
        action = input("请输入操作: ").strip().upper()
        
        if action.isdigit() and 1 <= int(action) <= len(current_results):
            # 查看详情
            index = int(action) - 1
            print("\n--- 结果详情 ---")
            print(f"标题: {current_results[index]['title']}")
            print(f"链接: {current_results[index]['full_url']}")
            print(f"摘要: {current_results[index]['summary']}")
            input("按任意键返回...")
        elif action == 'S':
            # 保存全部
            save_config_menu(current_results)
            break
        elif action.startswith('P '):
            # 保存部分
            try:
                indices = [int(i.strip()) - 1 for i in action[2:].split(',') if i.strip()]
                selected_results = [current_results[i] for i in indices if 0 <= i < len(current_results)]
                if selected_results:
                    save_config_menu(selected_results)
                    break
                else:
                    print("[ERROR] 选中的结果编号无效。")
                    time.sleep(1)
            except ValueError:
                print("[ERROR] 格式错误，请使用 P 1,5,8 的形式。")
                time.sleep(1)
        elif action == 'R':
            # 重新配置
            break
        elif action == '0':
            # 返回主菜单
            current_results = []
            break
        else:
            print("[ERROR] 无效操作。")
            time.sleep(1)

def save_config_menu(results_to_save):
    """2.3 数据保存设置菜单"""
    global SAVE_CONFIG, history_files
    num_results = len(results_to_save)
    
    while True:
        clear_screen()
        print(f"--- 2.3 数据保存设置 (共 {num_results} 条) ---")
        
        print("\nA. 内容深度配置")
        print(f"1. 保存文章全文 (默认: Yes): Current: {'Yes' if SAVE_CONFIG['include_full_text'] else 'No'}")
        print(f"2. 包含页面内链接文本: Current: {'Yes' if SAVE_CONFIG['include_links_data'] else 'No'}")
        print(f"3. 媒体内容处理: Current: {SAVE_CONFIG['media_action']} (可选: links_only / download_files)")
        
        print("\nB. 格式与路径配置")
        print(f"4. 选择保存格式: Current: {SAVE_CONFIG['format']} (可选: JSON, CSV, MD)")
        print(f"5. 指定保存文件名: Default: wiki_search_{get_timestamp()}.{SAVE_CONFIG['format'].lower()}")
        print(f"6. 指定保存路径: Current: {SAVE_CONFIG['path']}")
        
        print("\nE. 确认并执行保存")
        print("0. 取消操作并返回上一菜单")
        
        choice = input("请输入选项: ").strip().upper()
        
        if choice == '1':
            SAVE_CONFIG['include_full_text'] = not SAVE_CONFIG['include_full_text']
        elif choice == '2':
            SAVE_CONFIG['include_links_data'] = not SAVE_CONFIG['include_links_data']
        elif choice == '3':
            action = input("请输入新的媒体处理方式 (links_only / download_files): ").strip().lower()
            if action in ['links_only', 'download_files']:
                SAVE_CONFIG['media_action'] = action
            else:
                print("[ERROR] 输入无效。")
        elif choice == '4':
            fmt = input("请输入保存格式 (JSON/CSV/MD): ").strip().upper()
            if fmt in ['JSON', 'CSV', 'MD']:
                SAVE_CONFIG['format'] = fmt
            else:
                print("[ERROR] 输入无效。")
        elif choice == '5':
             # 实际上文件名会在执行E时动态生成，这里不需要修改
             print("[INFO] 文件名将在执行保存时自动生成，请在路径中查看。")
             time.sleep(1)
        elif choice == '6':
            SAVE_CONFIG['path'] = input("请输入新的保存路径: ").strip() or SAVE_CONFIG['path']
        elif choice == 'E':
            execute_save(results_to_save)
            break
        elif choice == '0':
            break
        else:
            print("[ERROR] 无效选项。")
            time.sleep(1)

def execute_save(data_to_save):
    """执行文件保存操作"""
    
    os.makedirs(SAVE_CONFIG['path'], exist_ok=True)
    
    # 1. 准备文件名和路径
    timestamp = get_timestamp()
    base_filename = f"wiki_search_{timestamp}"
    extension = SAVE_CONFIG['format'].lower()
    
    # 2. 格式化数据
    if extension == 'json':
        content = format_to_json(data_to_save)
    elif extension == 'csv':
        content = format_to_csv(data_to_save)
    elif extension == 'md':
        content = format_to_markdown(data_to_save)
    else:
        print(f"[FATAL] 未知的保存格式: {extension}")
        return

    # 3. 处理媒体内容
    media_dir = None
    if SAVE_CONFIG['media_action'] == 'download_files':
        media_dir = os.path.join(SAVE_CONFIG['path'], f"{base_filename}_media")
        os.makedirs(media_dir, exist_ok=True)
        
        all_media = []
        for item in data_to_save:
            all_media.extend(item.get('media', []))
        
        downloaded_paths = download_media(all_media, media_dir)
        print(f"[INFO] 成功下载 {len(downloaded_paths)} 个媒体文件。")

    # 4. 写入主文件
    main_file_path = os.path.join(SAVE_CONFIG['path'], f"{base_filename}.{extension}")
    try:
        with open(main_file_path, 'w', encoding='utf-8') as f:
            f.write(content)
        
        print(f"\n[SUCCESS] 数据保存成功到: {main_file_path}")
        if media_dir:
            print(f"[SUCCESS] 媒体文件保存到: {media_dir}")

        history_files.append(main_file_path)
        input("按任意键返回...")
    except Exception as e:
        print(f"[FATAL] 保存文件失败: {e}")
        input("按任意键返回...")

def manage_menu():
    """2.4 数据管理菜单"""
    global history_files
    
    while True:
        # 刷新文件列表 (模拟，实际应扫描目录)
        # 实际应用中，您可能希望扫描 SAVE_CONFIG['path'] 目录
        current_history = [f for f in history_files if os.path.exists(f)]
        
        clear_screen()
        print("--- 2.4 已保存结果管理 ---")
        if not current_history:
            print("[INFO] 当前没有已保存文件记录。")
        else:
            for i, fpath in enumerate(current_history):
                print(f"[{i+1}]. {os.path.basename(fpath)}")

        print("\n--- 操作 ---")
        print(" [数字]  - 查看指定文件内容 (打印前10行)")
        print(" D [数字]- 删除指定文件 (如: D 1)")
        print(" R       - 刷新文件列表")
        print(" 0       - 返回主菜单")
        
        action = input("请输入操作: ").strip().upper()
        
        if action.isdigit() and 1 <= int(action) <= len(current_history):
            # 查看文件内容
            fpath = current_history[int(action)-1]
            print(f"\n--- {os.path.basename(fpath)} (前10行) ---")
            try:
                with open(fpath, 'r', encoding='utf-8') as f:
                    for i in range(10):
                        line = f.readline()
                        if not line: break
                        print(line.strip())
            except Exception as e:
                print(f"[ERROR] 读取文件失败: {e}")
            input("按任意键返回...")

        elif action.startswith('D '):
            # 删除文件
            try:
                index = int(action[2:].strip()) - 1
                if 0 <= index < len(current_history):
                    file_to_delete = current_history[index]
                    confirm = input(f"确认删除文件 {os.path.basename(file_to_delete)} 吗? (y/n): ").strip().lower()
                    if confirm == 'y':
                        os.remove(file_to_delete)
                        history_files.remove(file_to_delete)
                        print(f"[SUCCESS] {os.path.basename(file_to_delete)} 已删除。")
                    else:
                        print("[INFO] 取消删除。")
                else:
                    print("[ERROR] 编号无效。")
            except Exception as e:
                print(f"[ERROR] 删除失败: {e}")
            time.sleep(1)

        elif action == 'R':
            continue
        elif action == '0':
            break
        else:
            print("[ERROR] 无效操作。")
            time.sleep(1)


# --- 程序启动入口 ---

if __name__ == "__main__":
    running = True
    while running:
        running = main_menu()
