
// Node.js HTTP服务包装器

const http = require('http');
const url = require('url');
const fs = require('fs');
const path = require('path');

// 服务配置
const HOST = process.env.HOST || '{{host}}';
const PORT = process.env.PORT || {{port}};
const TIMEOUT = process.env.TIMEOUT || {{timeout}};

// 尝试导入算法模块
let algorithmModule = null;
try {
    // 根据入口点导入算法
    if ("{{entry_point}}" === "") {
        // 尝试导入主要模块
        algorithmModule = require('./algorithm');
    } else {
        // 导入入口点
        algorithmModule = require('./{{entry_point}}');
    }
    console.log('算法模块导入成功');
} catch (e) {
    console.error('算法模块导入失败:', e);
    algorithmModule = null;
}

/**
 * 调用算法
 * @param {Object} requestData 请求数据
 * @returns {Object} 算法执行结果
 */
function callAlgorithm(requestData) {
    if (!algorithmModule) {
        throw new Error('算法模块未加载');
    }
    
    // 尝试调用算法的主要函数
    try {
        if (algorithmModule.predict) {
            return algorithmModule.predict(requestData);
        } else if (algorithmModule.run) {
            return algorithmModule.run(requestData);
        } else if (algorithmModule.main) {
            return algorithmModule.main(requestData);
        } else {
            throw new Error('未找到算法执行函数');
        }
    } catch (e) {
        throw new Error(`算法执行失败: ${e.message}`);
    }
}

/**
 * 处理请求
 * @param {http.IncomingMessage} req 请求对象
 * @param {http.ServerResponse} res 响应对象
 */
function handleRequest(req, res) {
    const parsedUrl = url.parse(req.url, true);
    const pathname = parsedUrl.pathname;
    
    // 设置响应头
    res.setHeader('Content-Type', 'application/json');
    
    if (req.method === 'GET') {
        if (pathname === "{{health_check_path}}") {
            // 健康检查
            res.writeHead(200);
            res.end(JSON.stringify({ status: 'healthy', service: '{{project_name}}' }));
        } else if (pathname === '/info') {
            // 服务信息
            const info = {
                service: '{{project_name}}',
                version: '1.0.0',
                host: HOST,
                port: PORT,
                timeout: TIMEOUT,
                algorithm_loaded: algorithmModule !== null
            };
            res.writeHead(200);
            res.end(JSON.stringify(info));
        } else {
            // 404响应
            res.writeHead(404);
            res.end(JSON.stringify({ error: 'Not Found' }));
        }
    } else if (req.method === 'POST') {
        let body = '';
        
        // 读取请求体
        req.on('data', chunk => {
            body += chunk.toString();
        });
        
        req.on('end', () => {
            try {
                // 解析请求数据
                const requestData = JSON.parse(body);
                
                // 记录请求开始时间
                const startTime = Date.now();
                
                // 调用算法
                const result = callAlgorithm(requestData);
                
                // 计算响应时间
                const responseTime = (Date.now() - startTime) / 1000;
                
                // 构建响应
                const response = {
                    success: true,
                    result: result,
                    response_time: responseTime.toFixed(4),
                    message: '算法执行成功'
                };
                
                // 发送响应
                res.writeHead(200);
                res.end(JSON.stringify(response));
            } catch (e) {
                // 构建错误响应
                const errorResponse = {
                    success: false,
                    error: e.message,
                    message: '算法执行失败'
                };
                
                // 发送错误响应
                res.writeHead(400);
                res.end(JSON.stringify(errorResponse));
            }
        });
    } else {
        // 不支持的方法
        res.writeHead(405);
        res.end(JSON.stringify({ error: 'Method Not Allowed' }));
    }
}

/**
 * 启动服务
 */
function startServer() {
    const server = http.createServer(handleRequest);
    
    server.listen(PORT, HOST, () => {
        console.log(`服务启动成功，监听地址: ${HOST}:${PORT}`);
        console.log(`健康检查地址: http://${HOST}:${PORT}{{health_check_path}}`);
        console.log(`服务信息地址: http://${HOST}:${PORT}/info`);
    });
    
    server.on('error', (error) => {
        console.error('服务启动失败:', error);
    });
}

// 启动服务
startServer();
