use vga::writers::{Graphics640x480x16, GraphicsWriter};

pub enum Color {
    /// Represents the color `Black (0x0)`.
    Black = 0x0,
    /// Represents the color `Blue (0x1)`.
    Blue = 0x1,
    /// Represents the color `Green (0x2)`.
    Green = 0x2,
    /// Represents the color `Cyan (0x3)`.
    Cyan = 0x3,
    /// Represents the color `Red (0x4)`.
    Red = 0x4,
    /// Represents the color `Magenta (0x5)`.
    Magenta = 0x5,
    /// Represents the color `Brown (0x6)`.
    Brown = 0x6,
    /// Represents the color `LightGrey (0x7)`.
    LightGrey = 0x7,
    /// Represents the color `DarkGrey (0x8)`.
    DarkGrey = 0x8,
    /// Represents the color `LightBlue (0x9)`.
    LightBlue = 0x9,
    /// Represents the color `LightGreen (0xA)`.
    LightGreen = 0xA,
    /// Represents the color `LightCyan (0xB)`.
    LightCyan = 0xB,
    /// Represents the color `LightRed (0xC)`.
    LightRed = 0xC,
    /// Represents the color `Pink (0xD)`.
    Pink = 0xD,
    /// Represents the color `Yellow (0xE)`.
    Yellow = 0xE,
    /// Represents the color `White (0xF)`.
    White = 0xF,
}

const VGA_BUFFER_SIZE: usize = 480;

pub struct ScreenBuffer {}
impl ScreenBuffer {
    pub fn initialise() {}

    pub fn flip_buffer() {
        /*
        before doing anything past here we need to tell the VGA about some things
        */
        let setup = false;
        if setup {
            use Color::*;
            let dualpixel: u8 = Red as u8;

            let buff: [u8; VGA_BUFFER_SIZE] = [dualpixel; VGA_BUFFER_SIZE];

            let buff_ptr = buff.as_ptr();
            let vga_buffer = 0xb8000 as *mut u8;

            use core::ptr;
            unsafe {
                ptr::copy(buff_ptr, vga_buffer, VGA_BUFFER_SIZE);
            }
        }
    }
}
