use std::time::Duration;

use esp_idf_svc::{
    eventloop::EspSystemEventLoop,
    hal::peripherals::Peripherals,
    wifi::{AccessPointConfiguration, AuthMethod, BlockingWifi, Configuration, EspWifi},
};
use log::info;
use heapless::String;

// 定义AP的SSID和密码
const SSID: &str = "ESP32-RUST-AP";
const PASSWORD: &str = "password123"; // 至少8个字符

fn main() -> anyhow::Result<()> {
    // 初始化ESP-IDF
    esp_idf_svc::sys::link_patches();
    esp_idf_svc::log::EspLogger::initialize_default();

    info!("Starting ESP32 WiFi AP...");

    // 获取系统事件循环和外设
    let peripherals = Peripherals::take()?;
    let sys_loop = EspSystemEventLoop::take()?;

    // 创建WiFi驱动
    let mut wifi = BlockingWifi::wrap(
        EspWifi::new(peripherals.modem, sys_loop.clone(), None)?,
        sys_loop,
    )?;

    info!("Setting up WiFi in AP mode...");

    // 创建heapless::String类型的SSID和密码
    let mut ssid: String<32> = String::new();
    let mut password: String<64> = String::new();
    
    // 将&str转换为heapless::String
    ssid.push_str(SSID).unwrap();
    password.push_str(PASSWORD).unwrap();

    // 配置AP模式
    let wifi_configuration = Configuration::AccessPoint(AccessPointConfiguration {
        ssid,
        password,
        auth_method: AuthMethod::WPA2Personal,
        ..Default::default()
    });

    // 应用配置并启动WiFi
    wifi.set_configuration(&wifi_configuration)?;
    wifi.start()?;

    info!("WiFi AP started with SSID: {}", SSID);
    info!("You can now connect to this AP with password: {}", PASSWORD);
    info!("AP IP address: 192.168.4.1");

    // 保持程序运行
    loop {
        std::thread::sleep(Duration::from_secs(10));
        info!("WiFi AP is running... (SSID: {})", SSID);
    }
}