// Copyright 2021 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 testdriver

import (
	"fmt"
	"os"
	"path/filepath"

	cipd "go.fuchsia.dev/fuchsia/sdk/cts/tools/testdriver/cipd"
)

const (
	// File permissions to use when creating the root workspace directory.
	permissions = 0755

	// TODO(jcecil): Read the CIPD package name from the CTS manifest file.
	linuxPkg = "fuchsia/sdk/gn/linux-amd64"
)

// Driver is the starting point for the Compatibility Test Suite.
type Driver struct {
	// workspacePath is the root working directory where all CTS artifacts
	// will be downloaded.
	workspacePath string

	// sdkVersion is the version of the GN SDK to download and execute the
	// CTS against.
	sdkVersion string

	// manifestPath is the path to the manifest listing all tests and
	// dependencies.
	manifestPath string
}

func NewDriver() *Driver {
	return &Driver{}
}

// The Driver fields are private to this testdriver package, so the following
// methods allow external tools (e.g. cmd/main.go) to configure the driver.
func (d *Driver) SetWorkspacePath(path string) { d.workspacePath = path }
func (d *Driver) SetSDKVersion(version string) { d.sdkVersion = version }
func (d *Driver) SetManifestPath(path string)  { d.manifestPath = path }

// Run executes the Compatibility Test Suite.
//
// All configuration settings should be set before calling this method.
func (d *Driver) Run() error {
	// Create workspace directory if it doesn't exist yet.
	if err := d.createWorkspace(); err != nil {
		return err
	}

	// Download the SDK archive.
	if err := d.downloadSDK(); err != nil {
		return err
	}

	// Load manifest file
	_, err := NewManifest(filepath.Join(d.workspacePath, d.manifestPath))
	if err != nil {
		return fmt.Errorf("failed to load manifest file %v: %v\n", d.manifestPath, err)
	}

	return nil
}

func (d *Driver) createWorkspace() error {
	fmt.Print("Creating Workspace directory... ")
	if err := os.MkdirAll(filepath.Clean(d.workspacePath), permissions); err != nil {
		return fmt.Errorf("Failed to make directory %s: %v\n", d.workspacePath, err)
	}
	fmt.Print("Done\n")
	return nil
}

func (d *Driver) downloadSDK() error {
	fmt.Print("Downloading SDK artifact... ")

	// We separate the SDK by the version string.
	//
	// An example CTS workspace may look like this:
	//
	// <d.workspacePath>
	// ├── sdk
	// │   ├── <d.sdkVersion>
	// │   │   └── sdk content
	// │   ├── <other sdk version>
	// │   ├── ...
	//
	sdkPath := filepath.Join(d.workspacePath, "sdk", d.sdkVersion)
	sdk, err := NewSDK(linuxPkg, d.sdkVersion, sdkPath)
	if err != nil {
		return fmt.Errorf("Failed to create new SDK: %v\n", err)
	}

	client := cipd.NewCLI()
	if err := sdk.Download(client); err != nil {
		return fmt.Errorf("Failed to download SDK version %s to location %s: %v\n", sdk.Version, sdk.sdkPath, err)
	}
	fmt.Print("Done\n")
	return nil
}
