package processor

import (
	"encoding/json"
	"fmt"
	"strings"

	"be.ems/src/framework/logger"
)

// ParseCat 解析拼装cat命令
func ParseCat(reqData any) (string, error) {
	msgByte, _ := json.Marshal(reqData)
	var data struct {
		FilePath   string `json:"filePath"`   // 文件地址
		ShowNumber bool   `json:"showNumber"` // 显示文件的行号，从 1 开始
		ShowAll    bool   `json:"showAll"`    // 结合 -vET 参数，显示所有特殊字符，包括行尾符、制表符等
	}
	if err := json.Unmarshal(msgByte, &data); err != nil {
		logger.Warnf("ws processor ParseCat err: %s", err.Error())
		return "", fmt.Errorf("query data structure error")
	}
	if data.FilePath == "" {
		return "", fmt.Errorf("query data filePath empty")
	}

	command := []string{"cat"}
	if data.ShowNumber {
		command = append(command, "-n")
	}
	if data.ShowAll {
		command = append(command, "-A")
	}

	command = append(command, data.FilePath)
	command = append(command, "\n")
	return strings.Join(command, " "), nil
}

// ParseTail 解析拼装tail命令
func ParseTail(reqData any) (string, error) {
	msgByte, _ := json.Marshal(reqData)
	var data struct {
		FilePath string `json:"filePath"` // 文件地址
		Lines    int    `json:"lines"`    // 显示文件末尾的指定行数
		Char     int    `json:"char"`     // 显示文件末尾的指定字数
		Follow   bool   `json:"follow"`   // 输出文件末尾的内容，并继续监视文件的新增内容
	}
	if err := json.Unmarshal(msgByte, &data); err != nil {
		logger.Warnf("ws processor ParseTail err: %s", err.Error())
		return "", fmt.Errorf("query data structure error")
	}
	if data.FilePath == "" {
		return "", fmt.Errorf("query data filePath empty")
	}

	command := []string{"tail"}
	if data.Follow {
		command = append(command, "-f")
	}
	if data.Lines > 0 {
		command = append(command, fmt.Sprintf("-n %d", data.Lines))
	}
	if data.Char > 0 {
		command = append(command, fmt.Sprintf("-c %d", data.Char))
	}

	command = append(command, data.FilePath)
	command = append(command, "\n")
	return strings.Join(command, " "), nil
}
