use super::super::color::use_colors;
use super::super::path_str;
use owo_colors::OwoColorize;
use std::fmt::Display;
use std::path::Path;

pub fn success(msg: impl Display) {
    if use_colors() {
        eprintln!("{} {}", "✓".green(), msg);
    } else {
        eprintln!("✓ {}", msg);
    }
}

pub fn info(msg: impl Display) {
    eprintln!("{}", msg);
}

pub fn hint(msg: impl Display) {
    if use_colors() {
        eprintln!("{} {}", "hint:".dimmed(), msg.to_string().dimmed());
    } else {
        eprintln!("hint: {}", msg);
    }
}

pub fn rendered(path: &Path) {
    if use_colors() {
        eprintln!("{}: {}", "Rendered".green(), path.display().cyan());
    } else {
        eprintln!("Rendered: {}", path.display());
    }
}

pub fn not_found(kind: &str, location: &Path) {
    if use_colors() {
        eprintln!("No {}s found in {}", kind, location.display().cyan());
    } else {
        eprintln!("No {}s found in {}", kind, location.display());
    }
}

pub fn check_header() {
    if use_colors() {
        eprintln!("{}:", "Checked".bold());
    } else {
        eprintln!("Checked:");
    }
}

pub fn check_count(count: usize, kind: &str) {
    if use_colors() {
        eprintln!("  {} {}", count.to_string().cyan().bold(), kind);
    } else {
        eprintln!("  {} {}", count, kind);
    }
}

pub fn render_summary(count: usize, kind: &str) {
    if use_colors() {
        eprintln!(
            "{} Rendered {} {}(s)",
            "✓".green(),
            count.to_string().cyan().bold(),
            kind
        );
    } else {
        eprintln!("✓ Rendered {} {}(s)", count, kind);
    }
}

pub fn created_path(path: &Path) {
    if use_colors() {
        eprintln!("{}: {}", "Created".green(), path.display().cyan());
    } else {
        eprintln!("Created: {}", path.display());
    }
}

pub fn changelog_rendered(path: &Path, release_count: usize, unreleased_count: usize) {
    if use_colors() {
        eprintln!(
            "Rendered CHANGELOG to {} ({} releases, {} unreleased)",
            path_str(path).cyan(),
            release_count,
            unreleased_count
        );
    } else {
        eprintln!(
            "Rendered CHANGELOG to {} ({} releases, {} unreleased)",
            path.display(),
            release_count,
            unreleased_count
        );
    }
}

pub fn sub_info(msg: impl Display) {
    eprintln!("  {}", msg);
}

pub fn dry_run_preview(path: &Path) {
    if use_colors() {
        eprintln!("{}: {}", "Would write".yellow(), path.display().cyan());
    } else {
        eprintln!("Would write: {}", path.display());
    }
    eprintln!("--- Content preview ---");
}

pub fn preview_line(line: &str) {
    eprintln!("{}", line);
}

pub fn preview_truncated() {
    eprintln!("...");
}

pub fn dry_run_file_preview(path: &Path, content: &str) {
    if use_colors() {
        eprintln!("{}: {}", "Would write".yellow(), path.display().cyan());
    } else {
        eprintln!("Would write: {}", path.display());
    }
    for line in content.lines().take(20) {
        eprintln!("  {}", line);
    }
    if content.lines().count() > 20 {
        eprintln!("  ...");
    }
}

pub fn dry_run_mkdir(path: &Path) {
    if use_colors() {
        eprintln!("{}: {}", "Would create dir".yellow(), path.display().cyan());
    } else {
        eprintln!("Would create dir: {}", path.display());
    }
}
