// Copyright 2018 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.

package main

import (
	"go.fuchsia.dev/jiri"
	"go.fuchsia.dev/jiri/cmdline"
	"go.fuchsia.dev/jiri/project"
)

var fetchPkgsFlags struct {
	localManifest     bool
	fetchPkgsTimeout  uint
	attempts          uint
	skipLocalProjects bool
}

var cmdFetchPkgs = &cmdline.Command{
	Runner: jiri.RunnerFunc(runFetchPkgs),
	Name:   "fetch-packages",
	Short:  "Fetch cipd packages using JIRI_HEAD version manifest",
	Long: `
Fetch cipd packages using local manifest JIRI_HEAD version if -local-manifest flag is
false, otherwise it fetches cipd packages using current manifest checkout version.
`,
}

func init() {
	cmdFetchPkgs.Flags.BoolVar(&fetchPkgsFlags.localManifest, "local-manifest", false, "Use local checked out manifest.")
	cmdFetchPkgs.Flags.UintVar(&fetchPkgsFlags.fetchPkgsTimeout, "fetch-packages-timeout", project.DefaultPackageTimeout, "Timeout in minutes for fetching prebuilt packages using cipd.")
	cmdFetchPkgs.Flags.UintVar(&fetchPkgsFlags.attempts, "attempts", 1, "Number of attempts before failing.")
	cmdFetchPkgs.Flags.BoolVar(&fetchPkgsFlags.skipLocalProjects, "skip-local-projects", false, "Skip checking local project state.")
}

func runFetchPkgs(jirix *jiri.X, args []string) (err error) {
	localProjects := project.Projects{}
	if !fetchPkgsFlags.skipLocalProjects {
		localProjects, err = project.LocalProjects(jirix, project.FastScan)
		if err != nil {
			return err
		}
	}
	if fetchPkgsFlags.attempts < 1 {
		return jirix.UsageErrorf("Number of attempts should be >= 1")
	}
	jirix.Attempts = fetchPkgsFlags.attempts

	// Get pkgs.
	var pkgs project.Packages
	if !fetchPkgsFlags.localManifest {
		_, _, pkgs, err = project.LoadUpdatedManifest(jirix, localProjects, fetchPkgsFlags.localManifest)
	} else {
		_, _, pkgs, err = project.LoadManifestFile(jirix, jirix.JiriManifestFile(), localProjects, fetchPkgsFlags.localManifest)
	}
	if err != nil {
		return err
	}
	if err := project.FilterOptionalProjectsPackages(jirix, jirix.FetchingAttrs, nil, pkgs); err != nil {
		return err
	}
	if len(pkgs) > 0 {
		return project.FetchPackages(jirix, pkgs, fetchPkgsFlags.fetchPkgsTimeout)
	}
	return nil
}
