package router

import (
	"mayfly-go/internal/devops/api"
	"mayfly-go/internal/devops/application"
	sysApplication "mayfly-go/internal/sys/application"
	"mayfly-go/pkg/ctx"

	"github.com/gin-gonic/gin"
)

func InitMachineFileRouter(router *gin.RouterGroup) {
	machineFile := router.Group("machines")
	{
		mf := &api.MachineFile{
			MachineFileApp: application.MachineFileApp,
			MachineApp:     application.MachineApp,
			MsgApp:         sysApplication.MsgApp,
		}

		// 获取指定机器文件列表
		machineFile.GET(":machineId/files", func(c *gin.Context) {
			ctx.NewReqCtxWithGin(c).Handle(mf.MachineFiles)
		})

		// 新增修改机器文件
		addFileConf := ctx.NewLogInfo("新增机器文件配置").WithSave(true)
		afcP := ctx.NewPermission("machine:file:add")
		machineFile.POST(":machineId/files", func(c *gin.Context) {
			ctx.NewReqCtxWithGin(c).WithLog(addFileConf).
				WithRequiredPermission(afcP).
				Handle(mf.SaveMachineFiles)
		})

		// 删除机器文件
		delFileConf := ctx.NewLogInfo("删除机器文件配置").WithSave(true)
		dfcP := ctx.NewPermission("machine:file:del")
		machineFile.DELETE(":machineId/files/:fileId", func(c *gin.Context) {
			ctx.NewReqCtxWithGin(c).WithLog(delFileConf).
				WithRequiredPermission(dfcP).
				Handle(mf.DeleteFile)
		})

		getContent := ctx.NewLogInfo("读取机器文件内容").WithSave(true)
		machineFile.GET(":machineId/files/:fileId/read", func(c *gin.Context) {
			ctx.NewReqCtxWithGin(c).WithLog(getContent).
				Handle(mf.ReadFileContent)
		})

		getDir := ctx.NewLogInfo("读取机器目录")
		machineFile.GET(":machineId/files/:fileId/read-dir", func(c *gin.Context) {
			ctx.NewReqCtxWithGin(c).WithLog(getDir).
				Handle(mf.GetDirEntry)
		})

		writeFile := ctx.NewLogInfo("写入or下载文件内容").WithSave(true)
		wfP := ctx.NewPermission("machine:file:write")
		machineFile.POST(":machineId/files/:fileId/write", func(c *gin.Context) {
			ctx.NewReqCtxWithGin(c).WithLog(writeFile).
				WithRequiredPermission(wfP).
				Handle(mf.WriteFileContent)
		})

		createFile := ctx.NewLogInfo("创建机器文件or目录").WithSave(true)
		machineFile.POST(":machineId/files/:fileId/create-file", func(c *gin.Context) {
			ctx.NewReqCtxWithGin(c).WithLog(createFile).
				WithRequiredPermission(wfP).
				Handle(mf.CreateFile)
		})

		uploadFile := ctx.NewLogInfo("文件上传").WithSave(true)
		ufP := ctx.NewPermission("machine:file:upload")
		machineFile.POST(":machineId/files/:fileId/upload", func(c *gin.Context) {
			ctx.NewReqCtxWithGin(c).WithLog(uploadFile).
				WithRequiredPermission(ufP).
				Handle(mf.UploadFile)
		})

		removeFile := ctx.NewLogInfo("删除文件or文件夹").WithSave(true)
		rfP := ctx.NewPermission("machine:file:rm")
		machineFile.DELETE(":machineId/files/:fileId/remove", func(c *gin.Context) {
			ctx.NewReqCtxWithGin(c).WithLog(removeFile).
				WithRequiredPermission(rfP).
				Handle(mf.RemoveFile)
		})
	}
}
