

use crate::prelude::*;




#[gen_特征_derive(MOD特征_ui_slint)]
impl 信令路由{
    async fn exec文本信令_ui_slint(&self,函数名:&str, mut 参数数组:Vec<String>)-> anyhow_Result<(bool,Value,Vec<String>)>{
        let 信令路由ref = self;
        let 结果 = match 函数名{
            "ui_slint"  =>{
                let 标题 = if 参数数组.len() >= 1{ 参数数组.remove(0) }else{ "rust默认窗口".to_string() };
                信令路由ref.GUI_弹出主线程窗口_slint(标题);
                json!(true)               
            }
            _=>{ return Ok((false, json!(""), 参数数组)); }
        };
        Ok((true, 结果, Vec::new()))
    }

    fn GUI_弹出主线程窗口_slint(&self, 标题:impl AsRef<str>){
        if let Some(通道数组) = self.core_chan任务流通道表().get(self.core_ref路由uuid()){
            if 通道数组.len()>=1{  通道数组[0].force_send(Box::new(信令表::弹出主线程窗口_slint { 标题:标题.as_ref().to_string() })).ok();    }
        }
    }
    
    fn on阻塞_主线程窗口_slint(&self)->anyhow_Result<()>{     //必须在主线程调用
        let (发送tx,接收rx) =  async_unbounded();
        self.core_chan任务流通道表().entry(self.core_ref路由uuid().clone())
                        .or_insert(Vec::new())
                        .push(发送tx);
        while let Ok(信令) = 接收rx.recv_blocking() {
            match 信令.try_into(){
                Err(err)=>{   eprintln!("来自其它信令表：{err}");     }
                Ok(信令表)=>{
                    match 信令表{ 
                        信令表::弹出主线程窗口_slint { 标题 }=>{
                            App_弹出窗口(self.clone(), 标题)
                        }
                        _=>{}
                    }
                }
            }
        }
        Ok(())
    }
}


#[derive(Clone, Serialize, Deserialize)]//可选特征
enum 信令表{
    test,
    弹出主线程窗口_slint{      标题:String  },
}
impl信令特征!(信令表, 执行函数);
async fn 执行函数(信令路由:信令路由,id:信令ID,单个信令:信令表)->anyhow_Result<信令表>{
    return Err(anyhow_err!("无需回复"));
}




use slint::{self, SharedString, Weak, VecModel,Model, ModelRc };
slint::slint!(export { SysWin, disk, 路由状态对象, os对象 } from "src/mod_ui/ui/scene.slint";);


fn App_弹出窗口(信令路由:信令路由, 标题:String){
    let 系统信息窗口 = SysWin::new().unwrap();
    系统信息窗口.set_窗口标题(SharedString::from(标题));


    let 更新视图ui_路由状态对象 = |信令路由:信令路由, win:Weak<SysWin>|{
        let d = 信令路由.rpc信令路由_状态();

        win.upgrade_in_event_loop(move|win|{
                let 路由状态mode = 路由状态对象{
                        路由uuid:SharedString::from(d.路由uuid), 
                        服务端类型:SharedString::from(d.服务端类型), 
                        版本号:SharedString::from(d.版本),
                        信令计数:d.信令计数 as i32,
                        等待的信令计数:d.等待的信令计数 as i32,
                        rusty_pool状态:SharedString::from(format!("{:?}",d.rusty_pool状态)),
                        启动时间:SharedString::from(d.启动时间), 
                        时间戳:SharedString::from(TIME时间::time_毫秒转日期(d.时间戳).unwrap_or_default()),
                        log记录:SharedString::from(format!("{:?}",d.log记录)),
                };
                win.set_路由状态实例(路由状态mode);
        }).ok();
    };
    let (信令路由c1,窗口c0) = (信令路由.clone(),系统信息窗口.as_weak());
    系统信息窗口.on_刷新ui_更新路由状态实例(move||{    更新视图ui_路由状态对象(信令路由c1.clone(),窗口c0.clone());    });



    
    let 更新视图ui_系统os = |信令路由:信令路由, win:Weak<SysWin>|{
        let 信令路由c1 = 信令路由.clone();
        let os = 信令路由c1.系统_读取系统OS信息().block阻塞完成().unwrap_or_default();
        let cpu = 信令路由c1.系统_读取CPU数组().block阻塞完成().unwrap_or_default();
        let net = 信令路由c1.系统_读取网络NET数组().block阻塞完成().unwrap_or_default().pop().unwrap_or_default();
        
        win.upgrade_in_event_loop(move|win|{ 
                // win.set_os_name(SharedString::from(format!("{} / {}",os.系统版本 ,os.内核版本))); 

                let os对象mode = os对象{
                    系统名:SharedString::from(os.系统名), 
                    主机名:SharedString::from(os.主机名), 
                    内核版本:SharedString::from(os.内核版本), 
                    系统版本:SharedString::from(os.系统版本), 
                    CPU架构:SharedString::from(os.CPU架构),
                    CPU型号:SharedString::from(cpu[0].CPU型号.clone()),
                    CPU核心数:SharedString::from(format!("{} / {}",cpu[0].CPU物理核心数, cpu.len())),
                    CPU占用率:(cpu.iter().map(|item|item.CPU使用率 ).sum::<f32>() / cpu.len() as f32 ) as i32 ,
                    NET总量:SharedString::from(format!("{} / {}",信令路由::fn_字节to可读(net.发送字节总量), 信令路由::fn_字节to可读(net.接收字节总量) )),
                    时间戳:SharedString::from(TIME时间::time_毫秒转日期(cpu[0].时间戳).unwrap_or_default()),
                };
                win.set_os对象实例(os对象mode);
        }).ok();
    };
    更新视图ui_系统os(信令路由.clone(),系统信息窗口.as_weak());
    let (信令路由c1,窗口c0) = (信令路由.clone(),系统信息窗口.as_weak());
    系统信息窗口.on_刷新ui_更新系统OS(move||{   更新视图ui_系统os(信令路由c1.clone(),窗口c0.clone());   });


    let 更新视图ui_磁盘数组 = |信令路由:信令路由, win:Weak<SysWin>|{
        let 磁盘数组 = 信令路由.系统_读取磁盘数组().block阻塞完成().unwrap_or_default();
        
        win.upgrade_in_event_loop(move|win|{
                let 磁盘mode = ModelRc::new(VecModel::from(
                    磁盘数组
                    .into_iter()
                    .map(|d| disk{
                        dev:SharedString::from(d.设备), 
                        mnt:SharedString::from(d.挂载路径),
                        total:SharedString::from(d.容量),
                        free:SharedString::from(d.可用),
                        占用比: d.已用百分比   as i32
                    }).collect::<Vec<_>>(),
                ));
                win.set_disk_vec(磁盘mode);
        }).ok();
    };
    更新视图ui_磁盘数组(信令路由.clone(),系统信息窗口.as_weak());
    let (信令路由c1,窗口c0) = (信令路由.clone(),系统信息窗口.as_weak());
    系统信息窗口.on_刷新ui_更新磁盘数组(move||{   更新视图ui_磁盘数组(信令路由c1.clone(),窗口c0.clone());   });


   



    //这个由 用户回调触发
    let 窗口c2 = 系统信息窗口.as_weak();
    系统信息窗口.on_按钮_点击关闭按钮(move||{
        eprintln!("slint_关闭按钮");
        窗口c2.upgrade_in_event_loop(|win|{ win.hide().ok();  }).ok();
        let _ = slint::quit_event_loop();
    });

 
    //这个由 窗口的关闭触发
    系统信息窗口.window().on_close_requested(move || {
        eprintln!("slint_关闭窗口"); 
        let _ = slint::quit_event_loop();
        slint::CloseRequestResponse::HideWindow
    });



    系统信息窗口.run().unwrap();
    eprintln!("🍊 slint_ui 退出循环");
}

