use std::path::PathBuf;

use clap::Parser;
use tracing::info;

use uv_cache::{Cache, CacheArgs};
use uv_configuration::Concurrency;
use uv_preview::Preview;
use uv_python::{EnvironmentPreference, PythonEnvironment, PythonPreference, PythonRequest};

#[derive(Parser)]
pub(crate) struct CompileArgs {
    /// Compile all `.py` in this or any subdirectory to bytecode
    root: PathBuf,
    python: Option<PathBuf>,
    #[command(flatten)]
    cache_args: CacheArgs,
}

pub(crate) async fn compile(args: CompileArgs) -> anyhow::Result<()> {
    let cache = Cache::try_from(args.cache_args)?.init().await?;

    let interpreter = if let Some(python) = args.python {
        python
    } else {
        let interpreter = PythonEnvironment::find(
            &PythonRequest::default(),
            EnvironmentPreference::OnlyVirtual,
            PythonPreference::default(),
            &cache,
            Preview::default(),
        )?
        .into_interpreter();
        interpreter.sys_executable().to_path_buf()
    };

    let files = uv_installer::compile_tree(
        &fs_err::canonicalize(args.root)?,
        &interpreter,
        &Concurrency::default(),
        cache.root(),
    )
    .await?;
    info!("Compiled {files} files");
    Ok(())
}
