import os
from flask import Flask, request, redirect, url_for, send_from_directory, render_template
from werkzeug.utils import secure_filename

# ==================== 配置 ====================

app = Flask(__name__)

# 上传目录
UPLOAD_FOLDER = '/opt/user_center/app/file_manager/uploads'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024  # 16MB 限制

# 从环境变量读取 URL 前缀（适配 Nginx 反向代理）
# 默认 /files，如果直接访问可以设为 /
URL_PREFIX = os.environ.get('URL_PREFIX', '/files')

# 确保上传目录存在
os.makedirs(UPLOAD_FOLDER, exist_ok=True)

# ==================== 自定义模板过滤器 ====================

@app.template_filter('filesize')
def filesize_filter(filename):
    """格式化文件大小显示"""
    try:
        size = os.path.getsize(filename)
        for unit in ['B', 'KB', 'MB', 'GB']:
            if size < 1024:
                return f"{size:.1f} {unit}"
            size /= 1024
        return f"{size:.1f} TB"
    except:
        return '-'

# ==================== 路由 ====================

@app.route(f'{URL_PREFIX}/', methods=['GET', 'POST'])
def upload_file():
    """文件上传与列表页面"""
    if request.method == 'POST':
        # 检查是否有文件
        if 'file' not in request.files:
            return '没有选择文件', 400
        
        file = request.files['file']
        if file.filename == '':
            return '文件名为空', 400
        
        # 保存文件
        if file:
            filename = secure_filename(file.filename)
            # 防止文件名冲突，添加时间戳前缀
            # import time
            # filename = f"{int(time.time())}_{filename}"
            
            save_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
            file.save(save_path)
            
            # 重定向回列表页（使用 url_for 自动生成正确路径）
            return redirect(url_for('upload_file'))
    
    # GET 请求：显示文件列表
    files = []
    try:
        files = os.listdir(app.config['UPLOAD_FOLDER'])
        files.sort()  # 按名称排序
    except Exception as e:
        app.logger.error(f"读取上传目录失败: {e}")
    
    return render_template(
        'index.html',
        files=files,
        uploads_dir=UPLOAD_FOLDER
    )


@app.route(f'{URL_PREFIX}/uploads/<name>')
def download_file(name):
    """文件下载"""
    # 安全检查：防止目录遍历攻击
    safe_name = secure_filename(name)
    if safe_name != name:
        return '非法文件名', 400
    
    try:
        return send_from_directory(
            app.config['UPLOAD_FOLDER'],
            safe_name,
            as_attachment=False  # 设为 True 则强制下载，False 则浏览器预览
        )
    except FileNotFoundError:
        return '文件不存在', 404


# ==================== 旧路径兼容（可选） ====================

@app.route('/', methods=['GET'])
def root_redirect():
    """根路径重定向到文件中心（方便直接访问 5001 端口时跳转）"""
    return redirect(url_for('upload_file'))


# ==================== 启动 ====================

if __name__ == '__main__':
    # 开发模式
    app.run(host='0.0.0.0', port=5001, debug=True)
