use crate::backends::*;
use std::path::Path;
use palette::{Lab, Srgb, FromColor, IntoColor, cast::{AsComponents, ComponentsAs}};
use kmeans_colors::{get_kmeans_hamerly, get_kmeans, MapColor};
const K: u8 = crate::colorspaces::MIN_COLS;
pub fn kmeans(f: &Path) -> Result<Vec<u8>> {
let img = image::ImageReader::open(f)?.with_guessed_format()?.decode()?.into_rgb8();
let img_vec: &[Srgb<u8>] = img.components_as();
let pixels: Vec<Lab> = img_vec
.iter()
.map(|px| px.into_format::<f32>().into_color())
.collect();
let max_iter = 300;
let converge = 1e-5;
let verbose = false;
fastrand::seed(0xBEEF);
let method = if K > 1 { get_kmeans_hamerly } else { get_kmeans };
let result = method(
K.into(),
max_iter,
converge,
verbose,
&pixels,
fastrand::u64(..),
);
let centroids: Vec<Srgb<u8>> = result
.centroids
.iter()
.map(|&lab| Srgb::from_color(lab).into_format::<u8>())
.collect();
let rgb: Vec<Srgb<u8>> = Srgb::map_indices_to_centroids(¢roids, &result.indices);
Ok(rgb.as_components().to_vec())
}