package handlers

import (
	"context"
	"time"

	"github.com/gin-gonic/gin"
	"github.com/niangaodev/art-code/runner"
	"github.com/niangaodev/art-code/utils"
)

type RunCodeRequest struct {
	Language string `json:"language" binding:"required"`
	Code     string `json:"code" binding:"required"`
}

func RunCode(c *gin.Context) {
	var req RunCodeRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		utils.Error(c, 400, "Invalid request")
		return
	}

	// 对于前端语言，直接返回代码供前端渲染，或者提示不支持后端执行
	switch req.Language {
	case "html", "vue", "react", "css":
		utils.Success(c, gin.H{
			"output":   req.Code, // 或者返回 "Client-side rendering only"
			"isClient": true,
		})
		return
	}

	// 获取运行器
	r, err := runner.GetRunner(req.Language)
	if err != nil {
		utils.Error(c, 400, err.Error())
		return
	}

	// 设置超时上下文 (例如 5 秒)
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()

	// 执行代码
	result, err := r.Run(ctx, req.Code)
	if err != nil {
		// 运行错误（如无法启动进程）
		utils.ServerError(c, err)
		return
	}

	utils.Success(c, result)
}
