use battery as battery_model;
use battery::State;
use ratatui::layout::{Constraint, Direction, Layout, Rect};
use ratatui::text::Line;

use crate::action::Action;
use crate::components::Component;
use crate::tui::Frame;

#[derive(Debug)]
pub struct Battery {
    battery: Option<battery_model::Battery>,
}

impl Default for Battery {
    fn default() -> Self {
        Self::new()
    }
}

impl Battery {
    pub fn new() -> Self {
        Self { battery: None }
    }
}

impl Component for Battery {
    fn init(&mut self) -> color_eyre::Result<()> {
        let batteries = battery_model::Manager::new().unwrap().batteries();
        if batteries.is_ok() {
            let b = batteries.unwrap().next().unwrap().unwrap();
            self.battery = Some(b);
        }
        Ok(())
    }

    fn update(&mut self, _action: Action) -> color_eyre::Result<Option<Action>> {
        let _ = self.init();
        Ok(None)
    }

    fn draw(&mut self, f: &mut Frame<'_>, rect: Rect) -> color_eyre::Result<()> {
        let layout =
            Layout::new(Direction::Horizontal, vec![Constraint::Percentage(100)]).split(rect);
        let mut state = "";
        if self.battery.is_some() {
            state = match self.battery.as_mut().unwrap().state() {
                State::Charging => "",
                State::Discharging => "",
                State::Full => "",
                State::Unknown => "",
                State::Empty => "",
                _ => "",
            };
        }
        let soc = self.battery.as_mut().unwrap().state_of_charge().value * 100.0;
        let percentage = format!("{}%", soc as u32);
        let status = format!("{}{} {}", "BAT", state, percentage);
        let line = Line::from(status);
        f.render_widget(line, layout[0]);
        Ok(())
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use log::info;
    use ratatui::{backend::TestBackend, prelude::*};

    #[test]
    fn test_battery() {
        let mut battery = Battery::default();
        let _ = battery.init();
        let backend = TestBackend::new(40, 20);
        let mut terminal = Terminal::new(backend).unwrap();
        let _ = terminal.draw(|frame| {
            let _r = battery.draw(frame, Rect::new(3, 3, 10, 1));
            let b = frame.buffer_mut();
            info!("{:#?}", b);
        });
        assert_eq!(true, true)
    }
}