
use crate::prelude::*;


//================ 文件 ================

#[derive(Debug,Serialize,Deserialize,Clone,Default)]
pub struct 文件项 {
    pub 文件名: String,
    pub 路径: String,
    pub id:String,
    pub 类型: String,
    /// - 指向源文件
    pub 类型mime:String,
    /// - 指向源文件
    pub 应用分类:String,
    /// - 指向源文件
    pub 扩展名: String,
    pub 文件大小: String,
    pub 文件大小size: u64,
    pub 创建时间: String,
    pub 创建时间ms: u128,
    pub 修改时间: String,
    pub 修改时间ms: u128,
    pub dev:u64,
    pub 权限mode:u32,
    pub 用户uid:u32,
    pub 源dev:u64,
    pub 源路径:String,
    pub 源类型:String,
    pub 源文件名:String,
    pub 源文件大小:String,
    pub 源文件大小size:u64,
    pub 隐藏文件:bool,
    pub 根目录:String,
    pub 相对路径:String,
    pub 目标路径:String,
    pub err:String, //记录错误信息
    pub 源err:String,
    pub 描述:String,
}







#[derive(Debug,Default,Clone, Serialize)]
pub struct 所有文件{
    pub 总量:String,
    pub 总量字节: u64,
    pub 文件数组: Vec<String>,
    pub 目录数组: Vec<String>,
}
impl std::ops::Add for 所有文件{
    type Output = 所有文件; 
    fn add(self, other: 所有文件) -> 所有文件 {
        let 总量字节 = self.总量字节 + other.总量字节;
        所有文件 {
            总量字节,
            总量: 信令路由::fn_字节to可读(总量字节),
            文件数组: [ self.文件数组, other.文件数组].concat(),
            目录数组: [ self.目录数组, other.目录数组].concat(),
        }
    }
}
impl std::ops::AddAssign for  所有文件{
    fn add_assign(&mut self, other:所有文件) {
        self.总量字节 += other.总量字节;
        self.总量 = 信令路由::fn_字节to可读(self.总量字节);
        self.文件数组.extend(other.文件数组 );   //vec1.append(&mut vec2);
        self.目录数组.extend(other.目录数组 );
    }
}



#[derive(Default,Clone, Serialize,Deserialize,Debug)]
pub struct 文件复制过程状态{ 
    pub copy_id:原子ID,
    pub uuid: String, 
    pub 后端事件id: u32, 
    
    pub 操作:String,
    pub 覆盖标志: String,

    pub 当前文件序号:usize,
    pub 总文件数:usize,
    pub 来源路径: String,
    pub 目标路径:String,
 
    pub 总量: String,
    pub 总已复制: String,
 
    pub 单文件已复制展示字符串:String,
    pub 速度:u64,
    pub 速度展示字符串:String,
    pub 总量字节: u64,
    pub 总已复制字节: u64,
    pub 单文件总量字节: u64,
    pub 单文件已复制字节:u64,
 
 
    pub 总百分比: u64,    // 0~100
    
    pub err:String,
    pub 工作状态:String,  //正常  错误   暂停 结束
    
    pub 存在复制流过程:bool,
    pub 跟随链接:bool,
}




#[derive(Debug,Clone,Default,Serialize,Deserialize)]
pub struct 文件统计信息{
    pub 个数:u64,
    pub 总量:String,
    pub 总量size:u64,
    pub err:String,
}  




#[derive(Clone, Serialize, Deserialize, EnumDisplay)]
pub enum 文件应用分类{
    文本,
    图像,
    音频,
    视频,
    应用,
    字体,
    表单数据,
}

#[derive(Clone, Serialize, Deserialize, EnumDisplay)]
pub enum 文件类型{
    文件夹,
    链接文件,
    文件,
    块设备文件,
    字符设备文件,
    管道文件,
    套接字文件,
    未知,
}


// impl std::fmt::Display for 文件移动控制指令{
//     fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
//         let 字符串 :&str;
//         match *self{
//             文件移动控制指令::正常=>{ 字符串 = "正常"}
//             文件移动控制指令::暂停=>{ 字符串 = "暂停"}
//             文件移动控制指令::正常结束=>{ 字符串 = "正常结束"}
//             文件移动控制指令::强制结束=>{ 字符串 = "强制结束"}
//         }
//         write!(f, "{}", 字符串)
//     }
// }



/// ##  文件操作 =>    "复制覆盖"  "复制不覆盖"   "复制共存"    "剪切覆盖"  "剪切不覆盖"  "剪切共存" 
/// - 第一个 剪切覆盖是对源文件    ,第二个覆盖共存是对目标文件
#[derive(Debug,Clone,Serialize, Deserialize)]
pub enum 文件操作{
    复制_覆盖,
    复制_不覆盖,
    复制_共存,
    剪切_覆盖,
    剪切_不覆盖,
    剪切_共存,
}

/// ##  文件操作 =>    "复制覆盖"  "复制不覆盖"   "复制共存"    "剪切覆盖"  "剪切不覆盖"  "剪切共存" 
/// - 第一个 剪切覆盖是对源文件    ,第二个覆盖共存是对目标文件
pub fn 字符串转_文件移动_操作指令(操作指令: impl AsRef<str>)->anyhow_Result<文件操作>{
    let 操作 = match 操作指令.as_ref(){
        "剪切覆盖"   =>  文件操作::剪切_覆盖,
        "剪切不覆盖" =>  文件操作::剪切_不覆盖,
        "剪切共存"   =>  文件操作::剪切_共存,
        "复制覆盖"   =>  文件操作::复制_覆盖,
        "复制不覆盖" =>  文件操作::复制_不覆盖,         //复制_跳过
        "复制共存"   =>  文件操作::复制_共存,
        v=>{   return Err(anyhow_err!("文件移动过程_操作指令, 无法识别: {v} 🍁 仅支持下面的指令 <复制覆盖> <复制不覆盖> <复制共存>   <剪切覆盖> <剪切不覆盖> <剪切共存>")); }
    };
    Ok(操作)
}

/// ##  控制指令 =>    "正常"   "暂停"   "强制结束"   "删除复制任务"
pub fn 字符串转_文件移动_控制指令(控制指令: impl AsRef<str>)->anyhow_Result<文件移动控制指令>{
    let 指令 = match  控制指令.as_ref(){
        "正常"=>         文件移动控制指令::正常,
        "暂停"=>         文件移动控制指令::暂停,
        "强制结束"=>      文件移动控制指令::强制结束,
        "删除复制任务"=>  文件移动控制指令::强制结束,
        v=>{   return Err(anyhow_err!("文件移动过程_控制, 无法识别: {v} 🍁 仅支持下面的指令 <正常> <暂停> <强制结束> <删除复制任务>")); }
    };
    Ok(指令)
}

/// ##  控制指令 =>    "正常"   "暂停"   "强制结束"   "删除复制任务"
#[derive(Clone, Serialize, Deserialize, EnumDisplay)]
pub enum 文件移动控制指令 {   
    正常, 
    暂停, 
    正常结束,
    强制结束,
}





