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

package main

import (
	"errors"
	"os"
	"os/exec"
	"path/filepath"
)

// Note: We keep this code in python as golang has no builtin
// shlex function.
const bisectPythonCommand = `
import bisect_driver
import shlex
import sys

def ExpandArgs(args, target):
	for arg in args:
		if arg[0] == '@':
			with open(arg[1:], 'r', encoding='utf-8') as f:
				ExpandArgs(shlex.split(f.read()), target)
		else:
			target.append(arg)
	return target

stage = sys.argv[1]
dir = sys.argv[2]
execargs = ExpandArgs(sys.argv[3:], [])

sys.exit(bisect_driver.bisect_driver(stage, dir, execargs))
`

func getBisectStage(env env) string {
	value, _ := env.getenv("BISECT_STAGE")
	return value
}

func calcBisectCommand(env env, cfg *config, bisectStage string, compilerCmd *command) (*command, error) {
	bisectDir, _ := env.getenv("BISECT_DIR")
	if bisectDir == "" {
		if cfg.isAndroidWrapper {
			homeDir, ok := env.getenv("HOME")
			if !ok {
				return nil, errors.New("$HOME is not set")
			}
			bisectDir = filepath.Join(homeDir, "ANDROID_BISECT")
		} else {
			bisectDir = "/tmp/sysroot_bisect"
		}
	}
	absCompilerPath := getAbsCmdPath(env, compilerCmd)
	pythonPath, err := exec.LookPath(os.Args[0])
	if err != nil {
		return nil, err
	}
	pythonPath, err = filepath.EvalSymlinks(pythonPath)
	if err != nil {
		return nil, err
	}
	pythonPath = filepath.Dir(pythonPath)
	return &command{
		Path: "/usr/bin/env",
		Args: append([]string{
			"python3",
			"-c",
			bisectPythonCommand,
			bisectStage,
			bisectDir,
			absCompilerPath,
		}, compilerCmd.Args...),
		EnvUpdates: append(compilerCmd.EnvUpdates, "PYTHONPATH="+pythonPath),
	}, nil
}
