partiri-cli 0.1.7

partiri CLI — Deploy and manage services on Partiri Cloud
use owo_colors::OwoColorize;

use crate::client::ApiClient;
use crate::config::{validate_config, PartiriConfig};
use crate::error::Result;
use crate::output::print_success;

pub fn run(client: &ApiClient, mut config: PartiriConfig) -> Result<()> {
    if config.id.is_some() {
        return Err(format!(
            "Service already created (id: {}).\n  Use 'partiri service push' to update it.",
            config.id.as_deref().unwrap()
        )
        .into());
    }

    // Validate before sending
    let results = validate_config(&config);
    let errors: Vec<_> = results.iter().filter(|r| !r.ok).collect();
    if !errors.is_empty() {
        for e in &errors {
            eprintln!("  {} {}: {}", "".red(), e.field.red(), e.message);
        }
        return Err("Config validation failed. Run 'partiri validate' for details.".into());
    }

    let service =
        client.create_service(&config.service, &config.fk_project, &config.fk_workspace)?;

    // Persist the assigned ID
    config.id = Some(service.id.clone());
    config.save()?;

    print_success(&format!("Service created — ID: {}", service.id.bold()));
    if let Some(url) = &service.external_sd_url {
        println!("  External URL: {}", url.cyan());
    }
    println!("\n  Run {} to deploy.", "'partiri service deploy'".bold());

    Ok(())
}