// Copyright (c) 2020 Gitpod GmbH. All rights reserved.
// Licensed under the GNU Affero General Public License (AGPL).
// See License.AGPL.txt in the project root for license information.

package main

// This utility can take an event trace log and turn it into a set of test fixtures

import (
	"bufio"
	"encoding/json"
	"flag"
	"fmt"
	"log"
	"os"
	"path/filepath"

	"github.com/gitpod-io/gitpod/ws-manager/api"
)

var evtsPath = flag.String("evts", "/tmp/evts.json", "path to the event trace log file")
var prefix = flag.String("prefix", "", "fixture prefix to identify the set of fixtures")

// EventTraceEntry is an entry from an event trace log
type EventTraceEntry struct {
	Status  api.WorkspaceStatus `json:"status"`
	Objects json.RawMessage     `json:"objects"`
}

func main() {
	flag.Parse()
	if *prefix == "" {
		fmt.Fprintln(os.Stderr, "-prefix is required")
		os.Exit(1)
	}

	file, err := os.Open(*evtsPath)
	if err != nil {
		log.Fatal(err)
	}
	defer file.Close()

	var i int
	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		var data EventTraceEntry
		err = json.Unmarshal(scanner.Bytes(), &data)
		if err != nil {
			panic(err)
		}

		phase := data.Status.Phase
		glob, err := filepath.Glob(fmt.Sprintf("status_%s_%03d_%s*.json", *prefix, i, phase))
		if err != nil {
			panic(err)
		}

		idx := len(glob)
		fn := fmt.Sprintf("status_%s_%03d_%s%02d.json", *prefix, i, phase, idx)
		ctnt, err := json.MarshalIndent(data.Objects, "", "  ")
		if err != nil {
			panic(err)
		}
		err = os.WriteFile(fn, ctnt, 0644)
		if err != nil {
			panic(err)
		}

		i++
		fmt.Printf("Wrote %s\n", fn)
	}
}
