// go.stargrave.org/tai64n -- Pure Go TAI64/TAI64N implementation
// Copyright (C) 2020-2026 Sergey Matveev <stargrave@stargrave.org>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 3 of the License.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

package main

import (
	"bufio"
	"flag"
	"fmt"
	"log"
	"os"
	"strings"
	"time"

	"go.stargrave.org/tai64n/v5"
)

const LocalFmt = "2006-01-02 15:04:05.000000000"

func main() {
	log.SetFlags(0)
	flag.Usage = func() {
		fmt.Fprintf(
			flag.CommandLine.Output(),
			"Replace \"@HEX(TAI64)\"-prefixed line with human readable UTC.\n",
		)
		flag.PrintDefaults()
	}
	leapsecs := flag.Bool("leapsecs", false, "Take leap seconds into account: honest TAI->UTC")
	db := flag.String("leapsecsdb", "", "Use that leapsecs.dat leap seconds database")
	flag.Parse()

	if *db != "" {
		buf, err := os.ReadFile(*db)
		if err != nil {
			log.Fatalln(err)
		}
		tai64n.Leapsecs.Load(buf)
	}

	scanner := bufio.NewScanner(os.Stdin)
	var err error
	var s string
	var sep int
	var t time.Time
	for {
		if !scanner.Scan() {
			if err = scanner.Err(); err != nil {
				log.Fatalln(err)
			}
			break
		}
		s = scanner.Text()
		if s[0] != '@' {
			os.Stdout.WriteString(s + "\n")
			continue
		}
		sep = strings.IndexByte(s, byte(' '))
		if sep == -1 {
			os.Stdout.WriteString(s + "\n")
			continue
		}
		t, err = tai64n.Decode(s[1:sep])
		if err != nil {
			log.Fatalln(err)
		}
		if *leapsecs {
			t, _ = tai64n.Leapsecs.Sub(t)
		}
		os.Stdout.WriteString(t.Format(LocalFmt) + s[sep:] + "\n")
	}
}
