package post

import (
	"fmt"
	"mini_server/internal/dao"
	"mini_server/internal/server/help"
	"mini_server/internal/server/httpreply"
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/sirupsen/logrus"
	"gorm.io/datatypes"
)

// 草稿处理逻辑。

type DraftInfo struct {
	UserId  int32          `json:"user_id"` // 发帖者
	Title   string         `json:"title"`
	Content string         `json:"content"`
	RoleIds datatypes.JSON `json:"role_ids"` // 帖子关联的角色id列表
}

type QueryDraftReply struct {
	DraftInfo *DraftInfo `json:"draft_info"`
}

// 上传草稿
func SaveDraft(c *gin.Context) {
	reply := httpreply.NewDefaultReplyData()
	defer httpreply.Reply(c, reply)

	userId, ok := help.GetUserId(c)
	if !ok {
		reply.Status = http.StatusNotFound
		reply.Message = "无法获取用户信息"
		return
	}

	var request UploadRequest
	if err := c.ShouldBindJSON(&request); err != nil {
		reply.Status = http.StatusBadRequest
		reply.Message = fmt.Sprintf("bad request, err:%v", err)
		return
	}

	// 将数据写入数据库中
	data := dao.Draft{
		UserId:  userId,
		Title:   request.Title,
		Content: request.Content,
		RoleIds: request.RoleIds,
	}

	if err := dao.Draft_Save(&data); err != nil {
		logrus.Errorf("保存草稿失败，userId:%d,err:%v", userId, err)
		reply.Status = http.StatusInternalServerError
		reply.Message = "保存草稿失败"
		return
	}
}

// 删除草稿
func DeleteDraft(c *gin.Context) {
	reply := httpreply.NewDefaultReplyData()
	defer httpreply.Reply(c, reply)

	userId, ok := help.GetUserId(c)
	if !ok {
		reply.Status = http.StatusNotFound
		reply.Message = "无法获取用户信息"
		return
	}

	if err := dao.Draft_Delete(userId); err != nil {
		logrus.Errorf("删除草稿失败，userId:%d,err:%v", userId, err)
		reply.Status = http.StatusInternalServerError
		reply.Message = "删除草稿失败"
		return
	}
}

// 查询草稿
func QueryDraft(c *gin.Context) {
	reply := httpreply.NewDefaultReplyData()
	defer httpreply.Reply(c, reply)

	userId, ok := help.GetUserId(c)
	if !ok {
		reply.Status = http.StatusNotFound
		reply.Message = "无法获取用户信息"
		return
	}

	data, err := dao.Draft_Query(userId)
	if err != nil {
		logrus.Errorf("查询草稿失败，userId:%d,err:%v", userId, err)
		reply.Status = http.StatusInternalServerError
		reply.Message = "查询草稿失败"
		return
	}

	queryDraftReply := QueryDraftReply{DraftInfo: nil}
	if data != nil {
		queryDraftReply.DraftInfo = &DraftInfo{
			UserId:  data.UserId,
			Title:   data.Title,
			Content: data.Content,
			RoleIds: data.RoleIds,
		}
	}
	reply.Data = queryDraftReply
}
