use embedded_svc::wifi::{AuthMethod, ClientConfiguration, Configuration};
use esp_idf_hal::peripherals::Peripherals;
use esp_idf_svc::eventloop::EspSystemEventLoop;
use esp_idf_svc::nvs::EspDefaultNvsPartition;
use esp_idf_svc::wifi::EspWifi;
use esp_idf_sys::EspError;


use esp_idf_hal::i2c::*;
use esp_idf_hal::prelude::*; //KHz
use ssd1306::{prelude::*, I2CDisplayInterface, Ssd1306};

use std::time::Duration;
use std::thread;
use hardware::HDisplay;

mod hardware;

fn main() -> anyhow::Result<()> {

    esp_idf_sys::link_patches();

    let peripherals = Peripherals::take().unwrap();
    let config = I2cConfig::new().baudrate(100.kHz().into());
    let i2c = I2cDriver::new(peripherals.i2c0, peripherals.pins.gpio7, peripherals.pins.gpio6, &config).unwrap();
    let interface = I2CDisplayInterface::new(i2c);

    
    let sysloop = EspSystemEventLoop::take()?;
    let nvs_default_partition = EspDefaultNvsPartition::take()?;
    
    let mut wifi = EspWifi::new(
        peripherals.modem,
        sysloop.clone(),
        Some(nvs_default_partition.clone()),
    )?;
    
    wifi.set_configuration(&Configuration::Client(ClientConfiguration {
        ssid: "Wokwi-GUEST".into(),
        password: "".into(),
        auth_method: AuthMethod::None,
        ..Default::default()
    }))?;
    
    wifi.start()?;
    wifi.connect()?;
    
    while !wifi.is_connected().unwrap(){
        //let config = wifi.get_configuration().unwrap();
        //println!("Waiting for station {:?}", config);
        print!(".");
        thread::sleep(Duration::from_millis(500));
    }

    println!("IP info: {:?}", wifi.sta_netif().get_ip_info().unwrap());


    let mut display = HDisplay::new(interface);

    display.init();
    
    display.flush();
    
    let mut mcu_pos: [i32; 2] = [12, 24];
    let mut ball_pos: [i32; 2] = [60, 28];

    let mut increasing = true;

    loop {
        
        if increasing{
            if mcu_pos[0]<= 12 ||  mcu_pos[0] < 116{
                mcu_pos[0]+=1;
            }else{
                increasing = false;
            }
        }else{
            if mcu_pos[0]>= 12 || mcu_pos[0] >= 116{
                mcu_pos[0]-=1;
            }else{
                increasing = true;
            }
        }
        
        
        display.clear_field();
        display.draw_text();
        display.draw_rectangle(&mut mcu_pos);
        display.draw_circle(&mut ball_pos);
        display.flush();
        //println!("{}",'a');
        thread::sleep(Duration::from_millis(100));
    }

}