#![no_std]
#![no_main]

use esp_backtrace as _;
use esp_hal::{
    delay::Delay,
    gpio::{Level, Output, Input, Pull},
    entry,
    //prelude::*,
    chip,
};
use esp_println::println;
use tm1637_embedded_hal::{blocking::TM1637, Brightness};
use rotary_encoder_embedded::{RotaryEncoder, Direction,};
use core::str;
use ssd1306_i2c::{displayrotation::DisplayRotation, displaysize::DisplaySize, Builder};


#[entry]
fn main() -> !{
    let peripherals = esp_hal::init(esp_hal::Config::default());
    println!("Hello, {}!", chip!());
    let mut led = Output::new(peripherals.GPIO8, Level::Low);
    let delay = Delay::new();
    //let clk = Output::new(peripherals.GPIO2, Level::Low);
    //let dio = Output::new(peripherals.GPIO3, Level::Low);
    //let mut tm = TM1637::builder(clk, dio, delay).build();
    //tm.init().unwrap();
    //tm.write_brightness(Brightness::L3).unwrap();
    // XXX vector init bad code 
    let mut vector: [u8; 4] = [49u8, 48u8, 48u8, 48u8];
    //tm.write_ascii_str(0, str::from_utf8(&vector).unwrap());
    let button = Input::new_typed(peripherals.GPIO10, Pull::Up,);
    let mut was_pressed = false;
    let rotary_dt = Input::new_typed(peripherals.GPIO0, Pull::Up,);
    let rotary_clk = Input::new_typed(peripherals.GPIO1, Pull::Up,);
    let mut encoder = RotaryEncoder::new(
        rotary_dt,
        rotary_clk,
    ).into_standard_mode();

    let scl = Input::new_typed(peripherals.GPIO4,);
    let sda = Input::new_typed(peripherals.GPIO5,);
    let i2c = peripherals.i2c0;
    let config = I2cConfig::new().baudrate(100.kHz().into());  // works ok at 400 kHz with short bus length
    let i2c_dev = I2cDriver::new(i2c, sda, scl, &config)?;
    let mut display: GraphicsMode<_> = Builder::new()
      .with_size(DisplaySize::Display128x64NoOffset)
      .with_i2c_addr(0x3C)  //or 0x3d
      .with_rotation(DisplayRotation::Rotate0)
      .connect_i2c(i2c_dev)
      .into()

    println!("Start Loop!");
    loop {
      let is_pressed = button.is_low();
      if is_pressed && !was_pressed {
          println!("Button pressed!");
          led.toggle();
      }
      was_pressed = is_pressed;
      match encoder.update() {
        Direction::Clockwise => {
            println!("Clockwise!");
            // XXX Increment value bad code 
            vector[3] += 1;
            //tm.write_ascii_str(0, str::from_utf8(&vector).unwrap());
        }
        Direction::Anticlockwise => {
            println!("Anticlockwise!");
            // XXX Decrement value bad code
            vector[3] -= 1;
            //tm.write_ascii_str(0, str::from_utf8(&vector).unwrap());
        }
        Direction::None => {
            // Do nothing
        }
    }
    delay.delay_millis(2u32);
  }
}
4-Digit Display