package common

import (
    "net/http"
    "strings"

    "bindbox-game/internal/code"
    "bindbox-game/internal/pkg/core"
)

// @Summary WangEditor图片上传
// @Description 适配 WangEditor 的图片上传接口
// @Tags Common
// @Accept multipart/form-data
// @Produce json
// @Param file formData file true "图片文件"
// @Success 200 {object} map[string]any "上传成功"
// @Failure 400 {object} map[string]any "上传失败"
// @Router /common/upload/wangeditor [post]
func (h *handler) UploadWangEditorImage() core.HandlerFunc {
    return func(ctx core.Context) {
        fh, err := ctx.FormFile("file")
        if err != nil {
            ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, "缺少文件"))
            return
        }
        // 限制文件大小不超过 5MB
        if fh.Size > 5*1024*1024 {
            ctx.AbortWithError(core.Error(http.StatusBadRequest, code.UploadError, "图片大小不能超过5MB"))
            return
        }
        f, err := fh.Open()
        if err != nil {
            ctx.AbortWithError(core.Error(http.StatusBadRequest, code.UploadError, err.Error()))
            return
        }
        defer f.Close()

        ct := fh.Header.Get("Content-Type")
        if ct == "" {
            ct = "application/octet-stream"
        }
        // 校验图片类型
        allowed := map[string]struct{}{
            "image/jpeg": {},
            "image/jpg":  {},
            "image/png":  {},
            "image/gif":  {},
            "image/webp": {},
            "image/bmp":  {},
        }
        if ct == "application/octet-stream" {
            // 一些浏览器可能未设置 content-type，允许继续，服务端会按扩展名纠正
        } else if _, ok := allowed[strings.ToLower(ct)]; !ok {
            if !strings.HasPrefix(strings.ToLower(ct), "image/") {
                ctx.AbortWithError(core.Error(http.StatusBadRequest, code.UploadError, "仅支持上传图片类型"))
                return
            }
        }

        url, err := h.svc.UploadImage(ctx.RequestContext(), fh.Filename, f, ct)
        if err != nil {
            ctx.AbortWithError(core.Error(http.StatusBadRequest, code.UploadError, err.Error()))
            return
        }

        resp := map[string]any{
            "errno": 0,
            "data": map[string]string{
                "url": url,
            },
        }
        ctx.Payload(resp)
    }
}
