#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
重新创建完整的app目录结构和文件
"""

import os
from pathlib import Path

def create_app_directory():
    """创建app目录结构"""
    print("=== 创建app目录结构 ===")

    base_dir = Path('.')

    # 创建主要目录结构
    directories = [
        'app',
        'app/core',
        'app/api',
        'app/api/v1',
        'app/api/v1/endpoints',
        'app/models',
        'app/schemas',
        'app/services',
        'app/utils'
    ]

    for dir_path in directories:
        full_path = base_dir / dir_path
        full_path.mkdir(parents=True, exist_ok=True)
        print(f"✓ 创建目录: {dir_path}")

def create_init_files():
    """创建__init__.py文件"""
    print("\n=== 创建__init__.py文件 ===")

    base_dir = Path('.')

    # 各目录的__init__.py内容
    init_contents = {
        'app/__init__.py': '"""云盘应用包"""\n\n__version__ = "1.0.0"\n',
        'app/core/__init__.py': '"""核心模块包"""\n',
        'app/api/__init__.py': '"""API模块包"""\n',
        'app/api/v1/__init__.py': '"""API v1模块包"""\n',
        'app/api/v1/endpoints/__init__.py': '"""API端点模块包"""\n',
        'app/models/__init__.py': '"""数据模型包"""\n',
        'app/schemas/__init__.py': '"""Pydantic模式包"""\n',
        'app/services/__init__.py': '"""业务逻辑服务包"""\n',
        'app/utils/__init__.py': '"""工具函数包"""\n'
    }

    for file_path, content in init_contents.items():
        full_path = base_dir / file_path
        if not full_path.exists():
            full_path.write_text(content, encoding='utf-8')
            print(f"✓ 创建文件: {file_path}")

def create_core_files():
    """创建核心文件"""
    print("\n=== 创建核心文件 ===")

    base_dir = Path('.')

    # app/core/config.py
    config_content = '''from pydantic_settings import BaseSettings
from typing import List
import os

class Settings(BaseSettings):
    # 基础配置
    ENVIRONMENT: str = "development"
    DEBUG: bool = True

    # 数据库配置
    DATABASE_URL: str = "mysql+pymysql://mytest_db:mytest_db@101.126.85.76:3306/mytest_db"

    # Redis配置
    REDIS_URL: str = "redis://localhost:6379"

    # JWT配置
    JWT_SECRET_KEY: str = "your-super-secret-jwt-key-change-in-production"
    JWT_ALGORITHM: str = "HS256"
    JWT_EXPIRE_MINUTES: int = 30
    JWT_REFRESH_EXPIRE_DAYS: int = 7

    # CORS配置
    ALLOWED_HOSTS: List[str] = [
        "http://localhost:3000",
        "http://localhost:3001",
        "http://localhost:3002",
        "http://localhost:3003",
        "http://localhost:3004",
        "http://127.0.0.1:3000",
        "http://127.0.0.1:3001",
        "http://127.0.0.1:3002",
        "http://127.0.0.1:3003",
        "http://127.0.0.1:3004",
        "http://172.16.16.89:3000",
        "http://172.16.16.89:3001",
        "http://172.16.16.89:3002",
        "http://172.16.16.89:3003",
        "http://172.16.16.89:3004",
        "*"
    ]

    # 文件上传配置
    MAX_FILE_SIZE: int = 10 * 1024 * 1024  # 10MB
    UPLOAD_DIR: str = "uploads"
    ALLOWED_EXTENSIONS: List[str] = [
        # 图片
        ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp", ".svg",
        # 文档
        ".pdf", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx",
        ".txt", ".rtf", ".csv",
        # 压缩文件
        ".zip", ".rar", ".7z", ".tar", ".gz",
        # 音频
        ".mp3", ".wav", ".flac", ".aac", ".ogg",
        # 视频
        ".mp4", ".avi", ".mkv", ".mov", ".wmv", ".flv",
        # 代码文件
        ".py", ".js", ".html", ".css", ".json", ".xml", ".yaml", ".yml",
        ".java", ".cpp", ".c", ".h", ".cs", ".php", ".rb", ".go",
        ".sql", ".sh", ".bat", ".ps1", ".md", ".log"
    ]

    # 安全配置
    BCRYPT_ROUNDS: int = 12

    class Config:
        env_file = ".env"
        case_sensitive = True

settings = Settings()
'''

    config_file = base_dir / 'app' / 'core' / 'config.py'
    config_file.write_text(config_content, encoding='utf-8')
    print("✓ 创建 app/core/config.py")

    # app/core/database.py
    database_content = '''from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from app.core.config import settings

# 创建数据库引擎
engine = create_engine(
    settings.DATABASE_URL,
    pool_pre_ping=True,
    pool_recycle=300,
)

# 创建会话工厂
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

# 创建Base类
Base = declarative_base()

def get_db():
    """获取数据库会话"""
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()
'''

    database_file = base_dir / 'app' / 'core' / 'database.py'
    database_file.write_text(database_content, encoding='utf-8')
    print("✓ 创建 app/core/database.py")

    # app/core/security.py
    security_content = '''from datetime import datetime, timedelta
from typing import Optional
from jose import JWTError, jwt
from passlib.context import CryptContext
from app.core.config import settings

# 密码加密上下文
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")

def verify_password(plain_password: str, hashed_password: str) -> bool:
    """验证密码"""
    return pwd_context.verify(plain_password, hashed_password)

def get_password_hash(password: str) -> str:
    """获取密码哈希"""
    return pwd_context.hash(password)

def create_access_token(data: dict, expires_delta: Optional[timedelta] = None):
    """创建访问令牌"""
    to_encode = data.copy()
    if expires_delta:
        expire = datetime.utcnow() + expires_delta
    else:
        expire = datetime.utcnow() + timedelta(minutes=settings.JWT_EXPIRE_MINUTES)

    to_encode.update({"exp": expire})
    encoded_jwt = jwt.encode(to_encode, settings.JWT_SECRET_KEY, algorithm=settings.JWT_ALGORITHM)
    return encoded_jwt

def verify_token(token: str):
    """验证令牌"""
    try:
        payload = jwt.decode(token, settings.JWT_SECRET_KEY, algorithms=[settings.JWT_ALGORITHM])
        return payload
    except JWTError:
        return None
'''

    security_file = base_dir / 'app' / 'core' / 'security.py'
    security_file.write_text(security_content, encoding='utf-8')
    print("✓ 创建 app/core/security.py")

def create_api_files():
    """创建API文件"""
    print("\n=== 创建API文件 ===")

    base_dir = Path('.')

    # app/api/v1/endpoints/health.py
    health_content = '''from fastapi import APIRouter, status
from datetime import datetime

router = APIRouter()

@router.get("/health", status_code=status.HTTP_200_OK)
async def health_check():
    """健康检查端点"""
    return {
        "status": "healthy",
        "timestamp": datetime.utcnow(),
        "version": "1.0.0",
        "message": "云盘后端服务运行正常"
    }

@router.get("/")
async def root():
    """根端点"""
    return {
        "message": "云盘应用 API",
        "version": "1.0.0",
        "docs": "/docs",
        "health": "/api/v1/health"
    }
'''

    health_file = base_dir / 'app' / 'api' / 'v1' / 'endpoints' / 'health.py'
    health_file.write_text(health_content, encoding='utf-8')
    print("✓ 创建 app/api/v1/endpoints/health.py")

    # app/api/v1/endpoints/auth.py
    auth_content = '''from fastapi import APIRouter, Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from sqlalchemy.orm import Session
from typing import Optional
from datetime import timedelta

from app.core.database import get_db
from app.core.security import verify_password, create_access_token
from app.core.config import settings
from app.schemas.user import UserCreate, UserResponse, Token

router = APIRouter()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="api/v1/auth/token")

@router.post("/register", response_model=UserResponse)
async def register(user_data: UserCreate, db: Session = Depends(get_db)):
    """用户注册"""
    # TODO: 实现用户注册逻辑
    return {"message": "注册功能待实现"}

@router.post("/token", response_model=Token)
async def login(form_data: OAuth2PasswordRequestForm = Depends(), db: Session = Depends(get_db)):
    """用户登录"""
    # TODO: 实现用户登录逻辑
    return {
        "access_token": "dummy_token",
        "token_type": "bearer",
        "expires_in": settings.JWT_EXPIRE_MINUTES * 60
    }

@router.get("/me", response_model=UserResponse)
async def get_current_user(token: str = Depends(oauth2_scheme), db: Session = Depends(get_db)):
    """获取当前用户信息"""
    # TODO: 实现获取当前用户逻辑
    return {"message": "用户信息功能待实现"}
'''

    auth_file = base_dir / 'app' / 'api' / 'v1' / 'endpoints' / 'auth.py'
    auth_file.write_text(auth_content, encoding='utf-8')
    print("✓ 创建 app/api/v1/endpoints/auth.py")

    # app/api/v1/endpoints/files.py
    files_content = '''from fastapi import APIRouter, Depends, HTTPException, UploadFile, File
from sqlalchemy.orm import Session
from typing import List

from app.core.database import get_db
from app.schemas.file import FileResponse, FileUploadResponse

router = APIRouter()

@router.post("/upload", response_model=FileUploadResponse)
async def upload_file(
    file: UploadFile = File(...),
    db: Session = Depends(get_db)
):
    """上传文件"""
    # TODO: 实现文件上传逻辑
    return {
        "message": "文件上传功能待实现",
        "filename": file.filename,
        "size": 0
    }

@router.get("/list", response_model=List[FileResponse])
async def list_files(
    skip: int = 0,
    limit: int = 100,
    db: Session = Depends(get_db)
):
    """获取文件列表"""
    # TODO: 实现文件列表逻辑
    return []

@router.get("/{file_id}", response_model=FileResponse)
async def get_file_info(file_id: int, db: Session = Depends(get_db)):
    """获取文件信息"""
    # TODO: 实现获取文件信息逻辑
    return {"message": "文件信息功能待实现"}

@router.delete("/{file_id}")
async def delete_file(file_id: int, db: Session = Depends(get_db)):
    """删除文件"""
    # TODO: 实现文件删除逻辑
    return {"message": "文件删除功能待实现"}
'''

    files_file = base_dir / 'app' / 'api' / 'v1' / 'endpoints' / 'files.py'
    files_file.write_text(files_content, encoding='utf-8')
    print("✓ 创建 app/api/v1/endpoints/files.py")

def create_schema_files():
    """创建Pydantic模式文件"""
    print("\n=== 创建模式文件 ===")

    base_dir = Path('.')

    # app/schemas/user.py
    user_schema_content = '''from pydantic import BaseModel, EmailStr
from typing import Optional

class UserBase(BaseModel):
    username: str
    email: EmailStr

class UserCreate(UserBase):
    password: str
    confirm_password: str

class UserUpdate(BaseModel):
    username: Optional[str] = None
    email: Optional[EmailStr] = None

class UserResponse(UserBase):
    id: int
    is_active: bool
    created_at: str

    class Config:
        from_attributes = True

class Token(BaseModel):
    access_token: str
    token_type: str
    expires_in: int
'''

    user_schema_file = base_dir / 'app' / 'schemas' / 'user.py'
    user_schema_file.write_text(user_schema_content, encoding='utf-8')
    print("✓ 创建 app/schemas/user.py")

    # app/schemas/file.py
    file_schema_content = '''from pydantic import BaseModel
from typing import Optional
from datetime import datetime

class FileBase(BaseModel):
    filename: str
    original_filename: str
    file_size: int
    content_type: str

class FileCreate(FileBase):
    pass

class FileUpdate(BaseModel):
    filename: Optional[str] = None

class FileResponse(FileBase):
    id: int
    user_id: int
    file_path: str
    created_at: datetime

    class Config:
        from_attributes = True

class FileUploadResponse(BaseModel):
    message: str
    filename: str
    size: int
    file_id: Optional[int] = None
'''

    file_schema_file = base_dir / 'app' / 'schemas' / 'file.py'
    file_schema_file.write_text(file_schema_content, encoding='utf-8')
    print("✓ 创建 app/schemas/file.py")

def verify_structure():
    """验证项目结构"""
    print("\n=== 验证项目结构 ===")

    base_dir = Path('.')

    required_files = [
        'app/__init__.py',
        'app/core/__init__.py',
        'app/core/config.py',
        'app/core/database.py',
        'app/core/security.py',
        'app/api/__init__.py',
        'app/api/v1/__init__.py',
        'app/api/v1/endpoints/__init__.py',
        'app/api/v1/endpoints/health.py',
        'app/api/v1/endpoints/auth.py',
        'app/api/v1/endpoints/files.py',
        'app/schemas/__init__.py',
        'app/schemas/user.py',
        'app/schemas/file.py'
    ]

    all_exist = True
    for file_path in required_files:
        full_path = base_dir / file_path
        if full_path.exists():
            print(f"✓ {file_path}")
        else:
            print(f"✗ {file_path}")
            all_exist = False

    if all_exist:
        print("\n🎉 所有文件创建成功！")
        print("现在可以运行: python main.py")
    else:
        print("\n⚠️  部分文件创建失败，请检查错误信息")

def main():
    """主函数"""
    print("=== 重新创建app目录结构 ===")

    # 创建目录结构
    create_app_directory()

    # 创建__init__.py文件
    create_init_files()

    # 创建核心文件
    create_core_files()

    # 创建API文件
    create_api_files()

    # 创建模式文件
    create_schema_files()

    # 验证结构
    verify_structure()

    print("\n=== 恢复完成 ===")
    print("app目录结构和所有必要文件已重新创建")
    print("下一步:")
    print("1. 激活虚拟环境: source venv/bin/activate")
    print("2. 安装依赖: pip install -r requirements.txt")
    print("3. 启动服务: python main.py")

if __name__ == '__main__':
    main()