// string_ops — 字串操作
// 支援: upper, lower, trim, capitalize, replace, split, join, includes,
//        starts_with, ends_with, length, substring
//
//go:build tinygo

package main

import (
	"encoding/json"
	"io"
	"os"
	"strings"
)

type Args struct {
	From   string   `json:"from"`
	To     string   `json:"to"`
	Sep    string   `json:"sep"`
	Items  []string `json:"items"`
	Substr string   `json:"substr"`
	Prefix string   `json:"prefix"`
	Suffix string   `json:"suffix"`
	Start  int      `json:"start"`
	End    int      `json:"end"`
}

type Input struct {
	Operation string `json:"operation"`
	Input     string `json:"input"`
	Args      Args   `json:"args"`
}

func main() {
	raw, err := io.ReadAll(os.Stdin)
	if err != nil {
		writeError("failed to read stdin: " + err.Error())
		return
	}
	var input Input
	if err := json.Unmarshal(raw, &input); err != nil {
		writeError("invalid input JSON: " + err.Error())
		return
	}
	if input.Operation == "" {
		writeError("operation 必填")
		return
	}

	var result interface{}

	switch input.Operation {
	case "upper":
		result = strings.ToUpper(input.Input)
	case "lower":
		result = strings.ToLower(input.Input)
	case "trim":
		result = strings.TrimSpace(input.Input)
	case "capitalize":
		if len(input.Input) == 0 {
			result = ""
		} else {
			result = strings.ToUpper(input.Input[:1]) + strings.ToLower(input.Input[1:])
		}
	case "replace":
		result = strings.ReplaceAll(input.Input, input.Args.From, input.Args.To)
	case "split":
		sep := input.Args.Sep
		if sep == "" {
			sep = ","
		}
		result = strings.Split(input.Input, sep)
	case "join":
		sep := input.Args.Sep
		result = strings.Join(input.Args.Items, sep)
	case "includes":
		result = strings.Contains(input.Input, input.Args.Substr)
	case "starts_with":
		result = strings.HasPrefix(input.Input, input.Args.Prefix)
	case "ends_with":
		result = strings.HasSuffix(input.Input, input.Args.Suffix)
	case "length":
		result = len([]rune(input.Input))
	case "substring":
		runes := []rune(input.Input)
		start := input.Args.Start
		end := input.Args.End
		if start < 0 {
			start = 0
		}
		if end <= 0 || end > len(runes) {
			end = len(runes)
		}
		if start > end {
			start = end
		}
		result = string(runes[start:end])
	default:
		writeError("不支援的 operation: " + input.Operation)
		return
	}

	out, _ := json.Marshal(map[string]interface{}{
		"success": true,
		"data": map[string]interface{}{
			"result":    result,
			"operation": input.Operation,
		},
	})
	os.Stdout.Write(out)
}

func writeError(msg string) {
	out, _ := json.Marshal(map[string]interface{}{"success": false, "error": msg})
	os.Stdout.Write(out)
}
