use crate::client::KeepClient;
use crate::modes::common::OutputFormat;
use crate::modes::common::settings_output_format;
use clap::Command;
use comfy_table::{Attribute, Cell, Table};
use log::debug;

pub fn mode(
    client: &KeepClient,
    _cmd: &mut Command,
    settings: &crate::config::Settings,
) -> Result<(), anyhow::Error> {
    debug!("CLIENT_STATUS: Getting status from remote server");

    let status_info = client.get_status()?;

    let output_format = settings_output_format(settings);

    match output_format {
        OutputFormat::Json | OutputFormat::Yaml => {
            crate::modes::common::print_serialized(&status_info, &output_format)?;
        }
        OutputFormat::Table => {
            // Paths
            let path_table =
                crate::modes::common::build_path_table(&status_info.paths, &settings.table_config);
            println!("PATHS:");
            println!(
                "{}",
                crate::modes::common::trim_lines_end(&path_table.trim_fmt())
            );
            println!();

            // Configured meta plugins
            if let Some(ref configured) = status_info.configured_meta_plugins
                && !configured.is_empty()
            {
                let mut sorted = configured.clone();
                sorted.sort_by(|a, b| a.name.cmp(&b.name));

                let mut table =
                    crate::modes::common::create_table_with_config(&settings.table_config);
                table.set_header(vec![
                    Cell::new("Plugin Name").add_attribute(Attribute::Bold),
                    Cell::new("Enabled").add_attribute(Attribute::Bold),
                ]);
                for plugin in &sorted {
                    let enabled = status_info.enabled_meta_plugins.contains(&plugin.name);
                    table.add_row(vec![
                        plugin.name.clone(),
                        if enabled { "Yes" } else { "No" }.to_string(),
                    ]);
                }
                println!("META PLUGINS:");
                println!(
                    "{}",
                    crate::modes::common::trim_lines_end(&table.trim_fmt())
                );
                println!();
            }

            // Compression
            if !status_info.compression.is_empty() {
                let mut table =
                    crate::modes::common::create_table_with_config(&settings.table_config);
                table.set_header(vec![
                    Cell::new("Type").add_attribute(Attribute::Bold),
                    Cell::new("Found").add_attribute(Attribute::Bold),
                    Cell::new("Default").add_attribute(Attribute::Bold),
                    Cell::new("Binary").add_attribute(Attribute::Bold),
                ]);
                for comp in &status_info.compression {
                    table.add_row(vec![
                        comp.compression_type.clone(),
                        if comp.found { "Yes" } else { "No" }.to_string(),
                        if comp.default { "Yes" } else { "No" }.to_string(),
                        comp.binary.clone(),
                    ]);
                }
                println!("COMPRESSION:");
                println!(
                    "{}",
                    crate::modes::common::trim_lines_end(&table.trim_fmt())
                );
                println!();
            }
        }
    }

    Ok(())
}
