#!/usr/bin/env python3
"""
详细调试下载接口的每个步骤
"""

import requests
import os
import mysql.connector

def debug_download_step_by_step():
    """逐步调试下载过程"""

    print("=== 详细下载接口调试 ===")

    # 测试参数
    user_id = 3
    file_id = 22

    print(f"测试参数: user_id={user_id}, file_id={file_id}")

    # 步骤1: 检查数据库中的文件记录
    print("\n--- 步骤1: 检查数据库记录 ---")
    try:
        conn = mysql.connector.connect(
            host='101.126.85.76',
            user='mytest_db',
            password='mytest_db',
            database='mytest_db'
        )
        cursor = conn.cursor()

        cursor.execute('''
            SELECT id, user_id, original_filename, filename, file_path, file_size, mime_type
            FROM files
            WHERE id = %s AND user_id = %s
        ''', (file_id, user_id))

        file_record = cursor.fetchone()

        if file_record:
            id, db_user_id, original_filename, filename, file_path, file_size, mime_type = file_record
            print(f"✅ 数据库记录找到:")
            print(f"  文件ID: {id}")
            print(f"  用户ID: {db_user_id}")
            print(f"  原始文件名: {original_filename}")
            print(f"  存储文件名: {filename}")
            print(f"  文件路径: {file_path}")
            print(f"  文件大小: {file_size} bytes")
            print(f"  MIME类型: {mime_type}")
        else:
            print("❌ 数据库中没有找到匹配的记录")
            return

        cursor.close()
        conn.close()

    except Exception as e:
        print(f"❌ 数据库查询失败: {e}")
        return

    # 步骤2: 检查实际文件是否存在
    print("\n--- 步骤2: 检查实际文件 ---")

    if os.path.exists(file_path):
        actual_size = os.path.getsize(file_path)
        print(f"✅ 文件存在:")
        print(f"  路径: {os.path.abspath(file_path)}")
        print(f"  实际大小: {actual_size} bytes")

        if actual_size == file_size:
            print("✅ 文件大小匹配数据库记录")
        else:
            print(f"⚠️ 文件大小不匹配: 数据库{file_size} vs 实际{actual_size}")

        # 检查文件可读性
        if os.access(file_path, os.R_OK):
            print("✅ 文件可读")

            # 读取文件内容验证
            try:
                with open(file_path, 'r', encoding='utf-8') as f:
                    content = f.read()
                print(f"✅ 文件内容可读，长度: {len(content)} 字符")
                print(f"  内容预览: {content[:50]}...")
            except Exception as e:
                print(f"❌ 读取文件内容失败: {e}")
        else:
            print("❌ 文件不可读 - 权限问题")
    else:
        print(f"❌ 文件不存在: {file_path}")
        return

    # 步骤3: 测试API下载请求
    print("\n--- 步骤3: 测试API下载请求 ---")

    try:
        download_data = {'user_id': user_id, 'file_id': file_id}

        print(f"发送请求: POST /api/v1/files/download")
        print(f"请求体: {download_data}")

        response = requests.post(
            'http://localhost:8000/api/v1/files/download',
            json=download_data,
            timeout=10
        )

        print(f"响应状态码: {response.status_code}")
        print(f"响应头: {dict(response.headers)}")

        if response.status_code == 200:
            print("✅ 下载成功!")

            content_type = response.headers.get('content-type', '')
            content_length = len(response.content)

            print(f"  响应类型: {content_type}")
            print(f"  内容长度: {content_length} bytes")

            if content_type.startswith('text/'):
                text_content = response.text
                print(f"  文本内容长度: {len(text_content)} 字符")
                print(f"  文本内容预览: {text_content[:50]}...")

                # 验证内容
                if len(text_content) == file_size / 2:  # 大约UTF-8字符数
                    print("✅ 内容大小预期范围内")
                else:
                    print(f"⚠️ 内容大小异常: 预期~{file_size//2}字符，实际{len(text_content)}字符")
            else:
                print("  二进制内容，无法显示预览")

        else:
            print("❌ 下载失败!")
            print(f"错误响应: {response.text}")

            # 尝试解析JSON错误
            try:
                error_data = response.json()
                print(f"错误详情: {error_data}")
            except:
                print("无法解析错误响应")

    except Exception as e:
        print(f"❌ API请求失败: {e}")
        import traceback
        traceback.print_exc()

if __name__ == "__main__":
    debug_download_step_by_step()