
use crate::prelude::*;

use std::{ time };
use data_encoding::BASE64;
use image;


#[gen_特征_derive(MOD特征_img)]
impl 信令路由{
    fn fn_img转WEBP图片dataurl(宽度:u32,高度:u32 ,图片raw:Vec<u8> ,缩放最大尺寸:Option<u32> )->anyhow_Result<String>{
        img转WEBP图片dataurl(宽度,高度,图片raw,图片格式::webp, 缩放最大尺寸)
    }
    fn img转WEBP图片dataurl(&self, 宽度:u32,高度:u32 ,图片raw:Vec<u8> ,缩放最大尺寸:Option<u32>  ) -> impl 信令任务<String>{
        core发布信令任务!(self, 信令表::转dataurl{宽度,高度,图片raw, 格式:图片格式::webp, 缩放最大尺寸 },  信令表::转dataurl_回复 => dataurl )
    }
    
}




#[derive(Clone, Serialize, Deserialize)]//可选特征
enum 信令表{
    转dataurl{  宽度:u32,高度:u32 ,图片raw:Vec<u8> , 格式:图片格式 , 缩放最大尺寸:Option<u32>  },
    转dataurl_回复{ dataurl:String },
}
impl信令特征!(信令表, 执行函数);      // 所有`信令表`必须实现此特征



async fn 执行函数(信令路由:信令路由,id:信令ID,单个信令:信令表)->anyhow_Result<信令表>{ 
    match 单个信令{
        信令表::转dataurl{宽度,高度,图片raw, 格式, 缩放最大尺寸 }=>{
            let dataurl =  信令路由.pool同步任务(move ||{  img转WEBP图片dataurl(宽度,高度,图片raw, 格式, 缩放最大尺寸) }).await??;
            anyhow_Ok信令!(信令表::转dataurl_回复 { dataurl })
        }

        _ =>{ return Err(anyhow_err!("信令不存在")); }
    }
}




#[derive(Clone,EnumDisplay,Serialize, Deserialize)]
pub enum 图片格式{
    webp,
    png,
    svg,
}


/// - 100 X 50   <缩放最大尺寸>  为20时 =>   20 X 10
pub fn img转WEBP图片dataurl(宽度:u32,高度:u32 ,图片raw:Vec<u8>,图片格式:图片格式, 缩放最大尺寸:Option<u32> )->anyhow_Result<String>{
    let mut 最终图片  = Vec::new();
    let encoder = match 图片格式 {
        图片格式::webp => { image::codecs::webp::WebPEncoder::new_lossless(&mut 最终图片)   }
        v => {  return Err(anyhow_err!("信令表::转dataurl 未实现 {v}")); }
    };
    if let Some(image_buffer)= image::ImageBuffer::<image::Rgba<u8>, _>::from_raw(宽度, 高度, 图片raw){            // let img = image::load_from_memory(data)?;  
        if let Some(out长度) = 缩放最大尺寸{
            let (out宽度,out高度) = if 宽度 > 高度{  (out长度,高度 / 宽度 * out长度)  }else{ (宽度 / 高度 * out长度, out长度)  };
            let img = image::DynamicImage::from(image_buffer);
            let resized_img = img.resize_exact( out宽度,  out高度, image::imageops::Triangle );
            resized_img.write_with_encoder(encoder)?;     
        }else{
            image_buffer.write_with_encoder(encoder)?;
        }
    }
    let mut 最终字符串 = BASE64.encode(&最终图片);
    最终字符串 = if 最终字符串 == ""{ 最终字符串 }else{ format!("data:image/webp;base64,{}", 最终字符串) };
    Ok(最终字符串)
}