//! CCGUI 移动版 Windows 壳：单窗口 WebView + 内嵌本地 HTTP 服务，加载移动端 H5。
//!
//! 与安卓壳一致：壳本身不含任何业务逻辑（PTY / 会话 / 隧道 / 微信都在桌面 host 端），
//! 只负责渲染 mobile-test.html，并让它通过 WebSocket 连回桌面端。
//!
//! 页面经本地 http://127.0.0.1 源提供（而非 Tauri 资产协议源）：窗口直接以
//! WebviewUrl::External 加载该地址，使页面处于 http 上下文，既能连公网中继 wss://，
//! 也能连局域网 ws://，规避安全源下的混合内容拦截。

use tauri::{WebviewUrl, WebviewWindowBuilder};

/// 编译时内嵌的移动端页面。build-mobile-win.ps1 会先把 mobile-test.html 拷到 ../web/index.html。
const MOBILE_HTML: &str = include_str!("../../web/index.html");

fn main() {
    tauri::Builder::default()
        .setup(|app| {
            // 找一个空闲端口（std 已知 API），再让 tiny_http 绑定，避免与桌面网关 45820 等冲突
            let free_port = {
                let l = std::net::TcpListener::bind("127.0.0.1:0").expect("查找空闲端口失败");
                l.local_addr().expect("读取本地地址失败").port()
            };
            let server = tiny_http::Server::http(format!("127.0.0.1:{free_port}"))
                .expect("本地 HTTP 服务启动失败");

            // 服务线程：任意 GET 返回内嵌页面；优先 %APPDATA%/ccgui/mobile-shell.html
            //（可热替换，改页面不必重编译，与桌面端 serve_http 的 mobile.html 覆盖约定一致）
            std::thread::spawn(move || {
                for req in server.incoming_requests() {
                    let custom = dirs::config_dir()
                        .map(|d| d.join("ccgui").join("mobile-shell.html"))
                        .and_then(|p| std::fs::read(p).ok());
                    let body = custom.unwrap_or_else(|| MOBILE_HTML.as_bytes().to_vec());
                    let resp = tiny_http::Response::from_data(body).with_header(
                        tiny_http::Header::from_bytes(
                            "Content-Type".as_bytes(),
                            "text/html; charset=utf-8".as_bytes(),
                        )
                        .expect("构造响应头失败"),
                    );
                    let _ = req.respond(resp);
                }
            });

            // 直接以本地 http 地址建窗：初始加载即外部 URL，http 上下文 → ws:// 与 wss:// 均可连
            let url = format!("http://127.0.0.1:{free_port}/")
                .parse()
                .expect("本地地址无效");
            WebviewWindowBuilder::new(app, "main", WebviewUrl::External(url))
                .title("CCGUI 移动版")
                .inner_size(1080.0, 760.0)
                .min_inner_size(380.0, 600.0)
                .resizable(true)
                .build()
                .expect("创建移动版窗口失败");
            Ok(())
        })
        .run(tauri::generate_context!())
        .expect("运行 CCGUI 移动版失败");
}
