// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// This is a helper script that regenerates the initial test metadata.

package main

import (
	"encoding/json"
	"io/ioutil"
	"log"
	"os"
	"path/filepath"
	"time"

	tuf "github.com/theupdateframework/go-tuf"
	"github.com/theupdateframework/go-tuf/sign"
)

var expirationDate = time.Date(2100, time.January, 1, 0, 0, 0, 0, time.UTC)

func loadKeys(repo *tuf.Repo, role string, path string) {
	f, err := os.Open(path)
	if err != nil {
		log.Fatal(err)
	}

	var persistedKeys struct {
		Encrypted bool               `json:"encrypted"`
		Data      []*sign.PrivateKey `json:"data"`
	}

	if err := json.NewDecoder(f).Decode(&persistedKeys); err != nil {
		log.Fatal(err)
	}

	for _, key := range persistedKeys.Data {
		if err := repo.AddPrivateKeyWithExpires(role, key, expirationDate); err != nil {
			log.Fatalf("failed to add private key: %s", err)
		}
	}
}

func main() {
	tempdir, err := ioutil.TempDir(".", "")
	if err != nil {
		log.Fatal(err)
	}
	defer os.RemoveAll(tempdir)

	repo, err := tuf.NewRepo(tuf.FileSystemStore(tempdir, nil))
	if err != nil {
		log.Fatalf("failed to create repository: %s", err)
	}

	if err := repo.Init(true); err != nil {
		log.Fatalf("failed init init: %s", err)
	}

	loadKeys(repo, "root", "keys/root.json")
	loadKeys(repo, "targets", "keys/targets.json")
	loadKeys(repo, "snapshot", "keys/snapshot.json")
	loadKeys(repo, "timestamp", "keys/timestamp.json")

	if repo.AddTargetsWithExpires([]string{}, nil, expirationDate); err != nil {
		log.Fatalf("failed to create targets: %s", err)
	}

	if err := repo.SnapshotWithExpires(tuf.CompressionTypeNone, expirationDate); err != nil {
		log.Fatalf("failed to create snapshot: %s", err)
	}

	if err := repo.TimestampWithExpires(expirationDate); err != nil {
		log.Fatalf("failed to create timestamp: %s", err)
	}

	if err := repo.Commit(); err != nil {
		log.Fatalf("failed to commit: %s", err)
	}

	// Delete the old metadata.
	if _, err := os.Stat("repository"); err == nil {
		if err := os.RemoveAll("repository"); err != nil {
			log.Fatal(err)
		}
	}

	if err := os.Rename(filepath.Join(tempdir, "repository"), "repository"); err != nil {
		log.Fatal(err)
	}
}
