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

use sdk::{sysroot_path, TargetOptions, toolchain_path};
use std::env;
use std::fs;
use std::path::PathBuf;
use std::process::Command;

error_chain!{

    links {
        SDK(::sdk::Error, ::sdk::ErrorKind);
    }

    foreign_links {
        Io(::std::io::Error);
    }
}

pub fn cross_root(target_options: &TargetOptions) -> Result<PathBuf> {
    let home_value = env::var("HOME").chain_err(
        || "HOME environmental variable not set",
    )?;

    Ok(
        PathBuf::from(home_value)
            .join(".fargo")
            .join("native_deps")
            .join(target_options.target_cpu),
    )
}

pub fn pkg_config_path(target_options: &TargetOptions) -> Result<PathBuf> {
    Ok(cross_root(target_options)?.join("lib").join("pkgconfig"))
}

pub fn run_pkg_config(
    verbose: bool,
    args: &[&str],
    target_options: &TargetOptions,
) -> Result<(i32)> {

    let mut cmd = Command::new("pkg-config");

    cmd.args(args)
        .env("PKG_CONFIG_PATH", "")
        .env("PKG_CONFIG_LIBDIR", pkg_config_path(&target_options)?)
        .env("PKG_CONFIG_ALL_STATIC", "1");

    if verbose {
        println!("pkg-config: {:?}", cmd);
    }

    cmd.status().chain_err(|| "Unable to run pkg-config").map(
        |s| {
            match s.code() {
                Some(code) => code,
                None => 1,
            }
        },
    )
}

pub fn run_configure(
    verbose: bool,
    use_host: bool,
    args: &[&str],
    target_options: &TargetOptions,
) -> Result<(bool)> {

    let cwd = fs::canonicalize(env::current_dir()?).chain_err(
        || "run_configure: canonicalize working directory",
    )?;

    let cross_root = cross_root(&target_options)?;
    let cross_root_str = cross_root.to_str().unwrap();
    let cross_lib = cross_root.join("lib");
    let cross_lib_str = cross_lib.to_str().unwrap();

    let sysroot_path = sysroot_path(&target_options)?;

    if verbose {
        println!("sysroot_path: {:?}", sysroot_path);
    }

    let toolchain_path = toolchain_path()?;

    if verbose {
        println!("toolchain_path: {:?}", toolchain_path);
    }

    let toolchain_bin_path = toolchain_path.join("bin");

    let common_c_flags = format!(
        "--sysroot={} --target=x86_64-fuchsia -fPIC -I{}",
        sysroot_path.to_str().unwrap(),
        cross_root.join("include").to_str().unwrap()
    );

    let prev_flags = env::var("LDFLAGS").unwrap_or("".to_string());
    let ld_flags = format!("{} {} -L{}", prev_flags, common_c_flags, cross_lib_str);

    if verbose {
        println!("CFLAGS: {}", env::var("CFLAGS").unwrap_or("".to_string()));
        println!("LDFLAGS: {}", ld_flags);
    }

    let prefix = format!("--prefix={}", cross_root_str);

    let mut configure_args = vec![];

    if use_host {
        configure_args.push("--host=x86_64-fuchsia-elf");
    }

    configure_args.push(&prefix);

    let mut cmd = Command::new(cwd.join("configure"));

    cmd.args(&configure_args)
        .args(args)
        .env("CC", toolchain_bin_path.join("clang"))
        .env("CXX", toolchain_bin_path.join("clang++"))
        .env("RANLIB", toolchain_bin_path.join("llvm-ranlib"))
        .env("LD", toolchain_bin_path.join("llvm-lld"))
        .env("AR", toolchain_bin_path.join("llvm-ar"))
        .env("CFLAGS", &common_c_flags)
        .env("CXXFLAGS", &common_c_flags)
        .env("CPPFLAGS", &common_c_flags)
        .env("LDFLAGS", ld_flags)
        .env("PKG_CONFIG_PATH", "")
        .env("PKG_CONFIG_LIBDIR", pkg_config_path(&target_options)?)
        .env("PKG_CONFIG_ALL_STATIC", "1");

    if verbose {
        println!("configure: {:?}", cmd);
    }

    cmd.status().chain_err(|| "Unable to run configure").map(
        |s| {
            s.success()
        },
    )
}
