// hash — 計算內容雜湊（純計算，無網路/檔案 syscall）
// 支援: sha256, sha1, md5；輸出編碼: hex（預設）, base64
// 用途：出貨線版本號機制（Leo/Arcrun#91）——內容一變雜湊必變，
// 是「改了東西版本沒動」在結構上不可能發生的機制來源。
//
//go:build tinygo

package main

import (
	"crypto/md5"
	"crypto/sha1"
	"crypto/sha256"
	"encoding/base64"
	"encoding/hex"
	"encoding/json"
	"io"
	"os"
)

type Input struct {
	Algorithm string `json:"algorithm"` // sha256（預設）| sha1 | md5
	Input     string `json:"input"`
	Encoding  string `json:"encoding"` // hex（預設）| base64
}

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

	algorithm := in.Algorithm
	if algorithm == "" {
		algorithm = "sha256"
	}
	encoding := in.Encoding
	if encoding == "" {
		encoding = "hex"
	}

	var sum []byte
	switch algorithm {
	case "sha256":
		h := sha256.Sum256([]byte(in.Input))
		sum = h[:]
	case "sha1":
		h := sha1.Sum([]byte(in.Input))
		sum = h[:]
	case "md5":
		h := md5.Sum([]byte(in.Input))
		sum = h[:]
	default:
		writeError("不支援的 algorithm: " + algorithm + "（支援 sha256/sha1/md5）")
		return
	}

	var result string
	switch encoding {
	case "hex":
		result = hex.EncodeToString(sum)
	case "base64":
		result = base64.StdEncoding.EncodeToString(sum)
	default:
		writeError("不支援的 encoding: " + encoding + "（支援 hex/base64）")
		return
	}

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

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