package cf

import (
	"fmt"
	"strings"

	"ops-assistant/internal/core/ecode"
	coremodule "ops-assistant/internal/core/module"
)

func commandSpecs() []coremodule.CommandSpec {
	return []coremodule.CommandSpec{
		{
			Prefixes: []string{"/cf status"},
			Template: coremodule.CommandTemplate{
				RunbookName: "cf_status",
				Gate: coremodule.Gate{
					NeedFlag:    "enable_module_cf",
					AllowDryRun: true,
				},
				DryRunMsg:  "🧪 dry-run: 将执行 /cf status（未实际执行）",
				SuccessMsg: func(jobID uint) string { return fmt.Sprintf("✅ /cf status 已执行，job=%d", jobID) },
			},
			ErrPrefix: "/cf status 执行失败: ",
		},
		{
			Prefixes: []string{"/cf zones"},
			Template: coremodule.CommandTemplate{
				RunbookName: "cf_zones",
				Gate: coremodule.Gate{
					NeedFlag:    "enable_module_cf",
					AllowDryRun: true,
				},
				DryRunMsg:  "🧪 dry-run: 将执行 /cf zones（未实际执行）",
				SuccessMsg: func(jobID uint) string { return fmt.Sprintf("✅ /cf zones 已执行，job=%d", jobID) },
			},
			ErrPrefix: "/cf zones 执行失败: ",
		},
		{
			Prefixes: []string{"/cf dns list"},
			Template: coremodule.CommandTemplate{
				RunbookName: "cf_dns_list",
				InputsFn: func(_ string, parts []string) (map[string]string, error) {
					if len(parts) < 4 {
						return nil, fmt.Errorf(ecode.Tag(ecode.ErrStepFailed, "参数不足，示例：/cf dns list <zone_id>"))
					}
					return map[string]string{"zone_id": parts[3]}, nil
				},
				Gate: coremodule.Gate{
					NeedFlag:    "enable_module_cf",
					AllowDryRun: true,
				},
				DryRunMsg:  "🧪 dry-run: 将执行 /cf dns list <zone_id>（未实际执行）",
				SuccessMsg: func(jobID uint) string { return fmt.Sprintf("✅ /cf dns list 已执行，job=%d", jobID) },
			},
			ErrPrefix: "/cf dns list 执行失败: ",
			ErrHint:   "/cf dns list <zone_id>",
		},
		{
			Prefixes: []string{"/cf dns update"},
			Template: coremodule.CommandTemplate{
				RunbookName: "cf_dns_update",
				InputsFn: func(_ string, parts []string) (map[string]string, error) {
					if len(parts) < 8 {
						return nil, fmt.Errorf(ecode.Tag(ecode.ErrStepFailed, "参数不足，示例：/cf dns update <zone_id> <record_id> <type> <name> <content> [ttl] [proxied]"))
					}
					inputs := map[string]string{
						"zone_id": parts[3],
						"record_id": parts[4],
						"type": parts[5],
						"name": parts[6],
						"content": parts[7],
					}
					if len(parts) >= 9 {
						inputs["ttl"] = parts[8]
					}
					if len(parts) >= 10 {
						inputs["proxied"] = parts[9]
					}
					return inputs, nil
				},
				Gate: coremodule.Gate{
					NeedFlag:    "enable_module_cf",
					AllowDryRun: true,
				},
				DryRunMsg:  "🧪 dry-run: 将执行 /cf dns update（未实际执行）",
				SuccessMsg: func(jobID uint) string { return fmt.Sprintf("✅ /cf dns update 已执行，job=%d", jobID) },
			},
			ErrPrefix: "/cf dns update 执行失败: ",
			ErrHint:   "/cf dns update <zone_id> <record_id> <type> <name> <content> [ttl] [proxied:true|false]",
		},
		{
			Prefixes: []string{"/cf dnsadd"},
			Template: coremodule.CommandTemplate{
				RunbookName: "cf_dns_add",
				InputsFn: func(_ string, parts []string) (map[string]string, error) {
					if len(parts) < 4 {
						return nil, fmt.Errorf(ecode.Tag(ecode.ErrStepFailed, "参数不足，示例：/cf dnsadd <name> <content> [on|off] [type]"))
					}
					name := parts[2]
					content := parts[3]
					proxied := "false"
					recType := "A"
					if len(parts) >= 5 {
						switch strings.ToLower(parts[4]) {
						case "on":
							proxied = "true"
							if len(parts) >= 6 {
								recType = parts[5]
							}
						case "off":
							proxied = "false"
							if len(parts) >= 6 {
								recType = parts[5]
							}
						case "true":
							proxied = "true"
							if len(parts) >= 6 {
								recType = parts[5]
							}
						case "false":
							proxied = "false"
							if len(parts) >= 6 {
								recType = parts[5]
							}
						default:
							// treat as type when no on/off provided
							recType = parts[4]
						}
					}
					inputs := map[string]string{
						"name":    name,
						"content": content,
						"type":    strings.ToUpper(recType),
						"proxied": strings.ToLower(proxied),
					}
					return inputs, nil
				},
				Gate: coremodule.Gate{
					NeedFlag:    "enable_module_cf",
					AllowDryRun: true,
				},
				DryRunMsg:  "🧪 dry-run: 将执行 /cf dnsadd（未实际执行）",
				SuccessMsg: func(jobID uint) string { return fmt.Sprintf("✅ /cf dnsadd 已执行，job=%d", jobID) },
			},
			ErrPrefix: "/cf dnsadd 执行失败: ",
			ErrHint:   "/cf dnsadd <name> <content> [on|off] [type]",
		},
		{
			Prefixes: []string{"/cf dnsset"},
			Template: coremodule.CommandTemplate{
				RunbookName: "cf_dns_set",
				InputsFn: func(_ string, parts []string) (map[string]string, error) {
					if len(parts) < 4 {
						return nil, fmt.Errorf(ecode.Tag(ecode.ErrStepFailed, "参数不足，示例：/cf dnsset <record_id> <content> [true]"))
					}
					proxied := "false"
					if len(parts) >= 5 && strings.EqualFold(parts[4], "true") {
						proxied = "true"
					}
					return map[string]string{
						"record_id": parts[2],
						"content":   parts[3],
						"proxied":   strings.ToLower(proxied),
					}, nil
				},
				Gate: coremodule.Gate{
					NeedFlag:    "enable_module_cf",
					AllowDryRun: true,
				},
				DryRunMsg:  "🧪 dry-run: 将执行 /cf dnsset（未实际执行）",
				SuccessMsg: func(jobID uint) string { return fmt.Sprintf("✅ /cf dnsset 已执行，job=%d", jobID) },
			},
			ErrPrefix: "/cf dnsset 执行失败: ",
			ErrHint:   "/cf dnsset <record_id> <content> [true]",
		},
		{
			Prefixes: []string{"/cf dnsdel"},
			Template: coremodule.CommandTemplate{
				RunbookName: "cf_dns_del",
				InputsFn: func(_ string, parts []string) (map[string]string, error) {
					if len(parts) < 4 {
						return nil, fmt.Errorf(ecode.Tag(ecode.ErrStepFailed, "参数不足，示例：/cf dnsdel <record_id> YES"))
					}
					if len(parts) < 4 || !strings.EqualFold(parts[3], "YES") {
						return nil, fmt.Errorf(ecode.Tag(ecode.ErrStepFailed, "缺少确认词 YES，示例：/cf dnsdel <record_id> YES"))
					}
					return map[string]string{
						"record_id": parts[2],
					}, nil
				},
				Gate: coremodule.Gate{
					NeedFlag:    "enable_module_cf",
					AllowDryRun: false,
				},
				SuccessMsg: func(jobID uint) string { return fmt.Sprintf("✅ /cf dnsdel 已执行，job=%d", jobID) },
			},
			ErrPrefix: "/cf dnsdel 执行失败: ",
			ErrHint:   "/cf dnsdel <record_id> YES",
		},
		{
			Prefixes: []string{"/cf dnsproxy"},
			Template: coremodule.CommandTemplate{
				RunbookName: "cf_dns_proxy",
				InputsFn: func(_ string, parts []string) (map[string]string, error) {
					if len(parts) < 4 {
						return nil, fmt.Errorf(ecode.Tag(ecode.ErrStepFailed, "参数不足，示例：/cf dnsproxy <record_id|name> on|off"))
					}
					mode := strings.ToLower(parts[3])
					if mode != "on" && mode != "off" {
						return nil, fmt.Errorf(ecode.Tag(ecode.ErrStepFailed, "参数无效，示例：/cf dnsproxy <record_id|name> on|off"))
					}
					proxied := "false"
					if mode == "on" {
						proxied = "true"
					}
					inputs := map[string]string{
						"proxied":   proxied,
						"record_id": "__empty__",
						"name":      "__empty__",
					}
					target := parts[2]
					if strings.Contains(target, ".") {
						inputs["name"] = target
					} else {
						inputs["record_id"] = target
					}
					return inputs, nil
				},
				Gate: coremodule.Gate{
					NeedFlag:    "enable_module_cf",
					AllowDryRun: true,
				},
				DryRunMsg:  "🧪 dry-run: 将执行 /cf dnsproxy（未实际执行）",
				SuccessMsg: func(jobID uint) string { return fmt.Sprintf("✅ /cf dnsproxy 已执行，job=%d", jobID) },
			},
			ErrPrefix: "/cf dnsproxy 执行失败: ",
			ErrHint:   "/cf dnsproxy <record_id|name> on|off",
		},
		{
			Prefixes: []string{"/cf workers list"},
			Template: coremodule.CommandTemplate{
				RunbookName: "cf_workers_list",
				Gate: coremodule.Gate{
					NeedFlag:    "enable_module_cf",
					AllowDryRun: true,
				},
				DryRunMsg:  "🧪 dry-run: 将执行 /cf workers list（未实际执行）",
				SuccessMsg: func(jobID uint) string { return fmt.Sprintf("✅ /cf workers list 已执行，job=%d", jobID) },
			},
			ErrPrefix: "/cf workers list 执行失败: ",
		},
	}
}
