// number_ops — 數字操作
// 支援: round, floor, ceil, abs, add, subtract, multiply, divide, mod, min, max, format
//
//go:build tinygo

package main

import (
	"encoding/json"
	"io"
	"math"
	"os"
	"strconv"
)

type Args struct {
	Value    float64 `json:"value"`
	Decimals int     `json:"decimals"`
}

type Input struct {
	Operation string  `json:"operation"`
	Input     float64 `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 "round":
		result = math.Round(input.Input)
	case "floor":
		result = math.Floor(input.Input)
	case "ceil":
		result = math.Ceil(input.Input)
	case "abs":
		result = math.Abs(input.Input)
	case "add":
		result = input.Input + input.Args.Value
	case "subtract":
		result = input.Input - input.Args.Value
	case "multiply":
		result = input.Input * input.Args.Value
	case "divide":
		if input.Args.Value == 0 {
			writeError("除數不能為 0")
			return
		}
		result = input.Input / input.Args.Value
	case "mod":
		if input.Args.Value == 0 {
			writeError("除數不能為 0")
			return
		}
		result = math.Mod(input.Input, input.Args.Value)
	case "min":
		result = math.Min(input.Input, input.Args.Value)
	case "max":
		result = math.Max(input.Input, input.Args.Value)
	case "format":
		decimals := input.Args.Decimals
		if decimals < 0 {
			decimals = 0
		}
		result = strconv.FormatFloat(input.Input, 'f', decimals, 64)
	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)
}
