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

package test

import (
	"bytes"
	"fmt"
	"strings"
	"sync"

	"v.io/jiri"
)

var cleanupOnce sync.Once
var cleanupError error

// cleanupProfiles is the entry point for ensuring profiles are in a sane
// state prior to running tests. There is often a need to get the current
// profiles installation into a sane state, either because of previous bugs,
// or to prepare for a subsequent change. This function is the entry point for that.
func cleanupProfiles(jirix *jiri.X) error {
	cleanupOnce.Do(func() { cleanupError = cleanupProfilesImpl(jirix) })
	return cleanupError
}

func cleanupProfilesImpl(jirix *jiri.X) error {
	cmds := []string{"list"}
	cleanup := []string{"cleanup --gc"}
	fmt.Fprintf(jirix.Stdout(), "cleanupProfiles: commands: %s\n", cleanup)
	cmds = append(cmds, cleanup...)
	cmds = append(cmds, "list")
	removals := []string{"cleanup -rm-all"}
	if isCI() {
		fmt.Fprintf(jirix.Stdout(), "cleanupProfiles: remove: %s\n", removals)
		if len(removals) > 0 {
			cmds = append(cmds, removals...)
			cmds = append(cmds, "list")
		}
	} else {
		fmt.Fprintf(jirix.Stdout(), "cleanupProfiles: skipping removals when not on CI\n")
	}
	s := jirix.NewSeq()
	for _, args := range cmds {
		var out bytes.Buffer
		clargs := append([]string{"profile"}, strings.Split(args, " ")...)
		err := s.Capture(&out, &out).Last("jiri", clargs...)
		fmt.Fprintf(jirix.Stdout(), "jiri %v: %v [[\n", strings.Join(clargs, " "), err)
		fmt.Fprintf(jirix.Stdout(), "%s]]\n", out.String())
	}
	return nil
}

func displayProfiles(jirix *jiri.X, msg string) {
	var out bytes.Buffer
	s := jirix.NewSeq()
	fmt.Fprintf(jirix.Stdout(), "%s: installed profiles:\n", msg)
	err := s.Capture(&out, &out).Last("jiri", "profile", "list", "--v")
	if err != nil {
		fmt.Fprintf(jirix.Stdout(), " %v\n", err)
		return
	}
	fmt.Fprintf(jirix.Stdout(), "\n%s\n", out.String())
	out.Reset()
	fmt.Fprintf(jirix.Stdout(), "recreate profiles with:\n")
	err = s.Capture(&out, &out).Last("jiri", "profile", "list", "--info", "Target.Command")
	if err != nil {
		fmt.Fprintf(jirix.Stdout(), " %v\n", err)
		return
	}
	fmt.Fprintf(jirix.Stdout(), "\n%s\n", out.String())
}
