use clap::ArgEnum;
use image::{imageops, GenericImage, Pixel};
use serde::{Deserialize, Serialize};

use crate::TypedOutputFormat;

#[derive(Copy, Clone, Serialize, Deserialize, ArgEnum, Debug)]
pub enum RotateDegree {
	#[serde(rename = "90")]
	One,
	#[serde(rename = "180")]
	Two,
	#[serde(rename = "270")]
	Three,
}

pub fn rotate<T: GenericImage>(
	image: &T,
	degree: RotateDegree,
) -> anyhow::Result<TypedOutputFormat<T>>
where
	T::Pixel: 'static,
	<T::Pixel as Pixel>::Subpixel: 'static,
{
	use RotateDegree::*;
	match degree {
		One => Ok(imageops::rotate90(image)),
		Two => Ok(imageops::rotate180(image)),
		Three => Ok(imageops::rotate270(image)),
	}
}