// date_ops — 日期操作
// 支援: now, format, parse
// TinyGo time 套件支援有限，只實作基本功能
//
//go:build tinygo

package main

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

type Args struct {
	Layout string `json:"layout"`
}

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
	}

	switch input.Operation {
	case "now":
		result := time.Now().UTC().Format(time.RFC3339)
		writeResult("now", result)
	case "format":
		if input.Input == "" {
			writeError("format 需要 input 日期字串")
			return
		}
		t, err := time.Parse(time.RFC3339, input.Input)
		if err != nil {
			// 嘗試其他格式
			t, err = time.Parse("2006-01-02", input.Input)
			if err != nil {
				writeError("無法解析日期: " + err.Error())
				return
			}
		}
		layout := input.Args.Layout
		if layout == "" {
			layout = time.RFC3339
		}
		writeResult("format", t.Format(layout))
	case "parse":
		if input.Input == "" {
			writeError("parse 需要 input 日期字串")
			return
		}
		t, err := time.Parse(time.RFC3339, input.Input)
		if err != nil {
			t, err = time.Parse("2006-01-02", input.Input)
			if err != nil {
				writeError("無法解析日期: " + err.Error())
				return
			}
		}
		writeResult("parse", map[string]interface{}{
			"iso":   t.UTC().Format(time.RFC3339),
			"year":  t.Year(),
			"month": int(t.Month()),
			"day":   t.Day(),
			"hour":  t.Hour(),
			"min":   t.Minute(),
			"sec":   t.Second(),
		})
	default:
		writeError("不支援的 operation: " + input.Operation)
	}
}

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

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