use core::alloc::Layout;

use crate::rhai_shell::shell;
use acpi::{AcpiTables, PlatformInfo};

/// Experimental scratchpad for testing.
pub fn scratchpad() {
    let axel_raw = "kernel{
    vals=
        time: 123
    fn|
        print: (None) -> (None);
        foo: (None) -> (Num); 
}";
    let axel = axel::parse(axel_raw.to_string());
    for node in axel {
        info!("{:?}", node);
    }
    // acpi();
    shell();
}

pub fn pci_fun() {}

pub fn acpi() {
    let acpi_handler = AcpiStruct {};
    let _table;
    unsafe {
        _table = AcpiTables::search_for_rsdp_bios(acpi_handler);
    }
    match _table.unwrap().platform_info().unwrap() {
        PlatformInfo {
            power_profile,
            interrupt_model,
            processor_info,
            pm_timer,
        } => {
            info!("{:?}", power_profile);
            info!("{:?}", interrupt_model);
            // info!("{:?}", processor_info.unwrap());
            // info!("{:?}", pm_timer.unwrap());
        }

        _ => todo!(),
    }
}
// TODO: move to a better place
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct AcpiStruct {}
impl acpi::AcpiHandler for AcpiStruct {
    unsafe fn map_physical_region<T>(
        &self,
        physical_address: usize,
        size: usize,
    ) -> acpi::PhysicalMapping<Self, T> {
        info!("PHYS ADDR: {:?}", physical_address);
        info!("Size: {:?}", size);
        todo!("map_physical_region");
    }
    fn unmap_physical_region<T>(_region: &acpi::PhysicalMapping<Self, T>) {
        todo!("unmap_physical_region");
    }
}
