#!/usr/bin/env python3
"""
MCP 手掌检测服务 HTTP 包装器
提供 HTTP API 接口，方便通过 HTTP 调用 MCP 服务
"""
import os
import json
import base64
import tempfile
from flask import Flask, request, jsonify
from flask_cors import CORS
from .server import MCPServer

app = Flask(__name__)
CORS(app)  # 允许跨域请求

# 初始化 MCP 服务器
mcp_server = MCPServer()

# 支持的图片格式
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif', 'bmp', 'webp'}

def allowed_file(filename):
    """检查文件扩展名是否允许"""
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

@app.route('/health', methods=['GET'])
def health():
    """健康检查端点"""
    return jsonify({
        "status": "healthy",
        "service": "mcp-hand-detection",
        "version": "1.0.1"
    })

@app.route('/api/detect', methods=['POST'])
def detect_hand():
    """
    检测手掌 API
    
    支持两种方式：
    1. 通过文件上传 (multipart/form-data)
    2. 通过 base64 编码的图片 (application/json)
    """
    try:
        image_path = None
        temp_file = None
        
        # 方式1: 文件上传
        if 'image' in request.files:
            file = request.files['image']
            if file.filename == '':
                return jsonify({"error": "未选择文件"}), 400
            
            if not allowed_file(file.filename):
                return jsonify({"error": "不支持的文件格式"}), 400
            
            # 保存临时文件
            temp_file = tempfile.NamedTemporaryFile(delete=False, suffix='.' + file.filename.rsplit('.', 1)[1].lower())
            file.save(temp_file.name)
            image_path = temp_file.name
        
        # 方式2: base64 编码
        elif request.is_json:
            data = request.get_json()
            if 'image_base64' in data:
                try:
                    # 解码 base64
                    image_data = base64.b64decode(data['image_base64'])
                    
                    # 确定文件扩展名
                    ext = data.get('image_format', 'png').lower()
                    if ext not in ALLOWED_EXTENSIONS:
                        ext = 'png'
                    
                    # 保存临时文件
                    temp_file = tempfile.NamedTemporaryFile(delete=False, suffix='.' + ext)
                    temp_file.write(image_data)
                    temp_file.close()
                    image_path = temp_file.name
                except Exception as e:
                    return jsonify({"error": f"Base64 解码失败: {str(e)}"}), 400
            elif 'image_path' in data:
                # 直接使用路径（需要确保路径安全）
                image_path = data['image_path']
                if not os.path.exists(image_path):
                    return jsonify({"error": "文件路径不存在"}), 400
            else:
                return jsonify({"error": "请提供 image、image_base64 或 image_path"}), 400
        else:
            return jsonify({"error": "请提供图片文件或 base64 编码"}), 400
        
        # 调用检测函数
        result = mcp_server._detect_hand(image_path)
        
        # 清理临时文件
        if temp_file and os.path.exists(temp_file.name):
            os.unlink(temp_file.name)
        
        return jsonify(result)
    
    except Exception as e:
        # 确保清理临时文件
        if temp_file and os.path.exists(temp_file.name):
            os.unlink(temp_file.name)
        
        return jsonify({
            "success": False,
            "error": str(e)
        }), 500

@app.route('/api/tools', methods=['GET'])
def list_tools():
    """获取可用工具列表"""
    tools = []
    for tool_name, tool_info in mcp_server.tools.items():
        tools.append({
            "name": tool_name,
            "description": tool_info["description"]
        })
    return jsonify({"tools": tools})


def create_app():
    """创建 Flask 应用实例（用于工厂模式）"""
    return app


if __name__ == '__main__':
    import argparse
    
    parser = argparse.ArgumentParser(description='MCP 手掌检测 HTTP 服务')
    parser.add_argument('--host', default='0.0.0.0', help='监听地址 (默认: 0.0.0.0)')
    parser.add_argument('--port', type=int, default=8080, help='监听端口 (默认: 8080)')
    parser.add_argument('--debug', action='store_true', help='启用调试模式')
    args = parser.parse_args()
    
    print(f"启动 HTTP 服务器: http://{args.host}:{args.port}")
    print(f"API 文档:")
    print(f"  - 健康检查: GET /health")
    print(f"  - 工具列表: GET /api/tools")
    print(f"  - 检测手掌: POST /api/detect")
    
    app.run(host=args.host, port=args.port, debug=args.debug)

