use crate::sdk::{
    clang_base_path, clang_resource_dir, shared_libraries_path, sysroot_path, TargetOptions,
};
use crate::X64;
use crate::{get_target_triple, get_triple_cpu};

use anyhow::Error;
use std::fs::create_dir_all;
use std::fs::File;
use std::io::Write;
use std::path::Path;
use std::process::Command;

pub fn build_rustc(rust_root: &Path, target_options: &TargetOptions<'_, '_>) -> Result<(), Error> {
    let target_triple = get_target_triple(target_options);
    let triple_cpu = get_triple_cpu(target_options);
    let targets_name = if target_options.config.fuchsia_arch == X64 { "X86" } else { "AArch64" };
    let clang_base_path = clang_base_path()?;
    let clang_bin_path = clang_base_path.join("bin");
    let staging = rust_root.join("fuchsia_staging");
    create_dir_all(&staging)?;
    let build = staging.join("build");
    create_dir_all(&build)?;
    let config_path = staging.join("config.toml");

    let mut config = File::create(&config_path)?;
    writeln!(
        config,
        r#"
[llvm]
optimize = true
static-libstdcpp = true
ninja = true
targets = "{targets}"

[build]
target = ["{target}-fuchsia"]
docs = false
extended = true
cargo-native-static = true

[install]
prefix = "{prefix}"
sysconfdir = "etc"

[rust]
optimize = true
channel = "nightly"
lld = true

[target.{target}-fuchsia]
cc = "{cc}"
cxx = "{cxx}"
ar = "{ar}"
linker = "{linker}"

[dist]
    "#,
        prefix = staging.to_string_lossy(),
        cc = clang_bin_path.join("clang").to_string_lossy(),
        cxx = clang_bin_path.join("clang++").to_string_lossy(),
        ar = clang_bin_path.join("llvm-ar").to_string_lossy(),
        linker = clang_bin_path.join("ld.lld").to_string_lossy(),
        target = triple_cpu,
        targets = targets_name,
    )?;

    let sysroot_path = sysroot_path(target_options)?;
    let sysroot_lib_path = sysroot_path.join("lib");
    let clang_resource_lib = clang_resource_dir(&target_triple)?.join(&target_triple).join("lib");

    let cargo_dir = staging.join(".cargo");
    create_dir_all(&cargo_dir)?;
    let cargo_config_path = cargo_dir.join("config");

    let mut cargo_config = File::create(&cargo_config_path)?;
    writeln!(
        cargo_config,
        r#"
[target.{target}-fuchsia]
ar = "{ar}"
rustflags = [
  "-C", "link-arg=--sysroot={sysroot}",
  "-C", "link-arg=-L{sysroot}/lib",
  "-C", "link-arg=-L{target_lib}",
  "-C", "link-arg=-L{clang_resource_lib}",
]
    "#,
        target = triple_cpu,
        sysroot = sysroot_path.to_string_lossy(),
        ar = clang_bin_path.join("llvm-ar").to_string_lossy(),
        target_lib = shared_libraries_path(target_options)?.to_string_lossy(),
        clang_resource_lib = clang_resource_lib.to_string_lossy(),
    )?;
    let x_py = rust_root.join("x.py");
    let common_c_flags =
        format!("--sysroot={} --target={}-fuchsia", sysroot_path.to_string_lossy(), triple_cpu);
    let ld_flags = format!(
        "--sysroot={} --target={}-fuchsia -L{}",
        sysroot_path.to_string_lossy(),
        triple_cpu,
        sysroot_lib_path.to_string_lossy()
    );
    let mut cmd = Command::new(x_py);
    cmd.current_dir(build)
        .env(format!("CFLAGS_{}-fuchsia", triple_cpu), &common_c_flags)
        .env(format!("LDFLAGS_{}-fuchsia", triple_cpu), &ld_flags)
        .arg("build")
        .arg("--config")
        .arg(&config_path)
        .arg("--target")
        .arg(format!("{}-fuchsia", triple_cpu));

    println!("cmd = {:#?}", cmd);
    cmd.status().expect("x_py command failed to start");
    Ok(())
}
