use crate::{BodyPattern, DashboardPattern, RGB};
use fixed::types::{I8F8, U16F0};

pub const RGB_OFF: RGB<I8F8> = RGB {
    r: I8F8::lit("0"),
    g: I8F8::lit("0"),
    b: I8F8::lit("0"),
};

pub const RGB_WHITE: RGB<I8F8> = RGB {
    r: I8F8::lit("1"),
    g: I8F8::lit("1"),
    b: I8F8::lit("1"),
};

pub const BRAKES_RED: RGB<I8F8> = RGB {
    r: I8F8::lit("1"),
    g: I8F8::lit("0"),
    b: I8F8::lit("0"),
};

pub const BLINKER_AMBER: RGB<I8F8> = RGB {
    r: I8F8::lit("1"),
    g: I8F8::lit("0.15"),
    b: I8F8::lit("0"),
};

pub const PRIDE_RED: RGB<I8F8> = RGB {
    r: I8F8::lit("0.95"),
    g: I8F8::lit("0.00"),
    b: I8F8::lit("0.00"),
};

pub const PRIDE_ORANGE: RGB<I8F8> = RGB {
    r: I8F8::lit("1.0"),
    g: I8F8::lit("0.25"),
    b: I8F8::lit("0"),
};

pub const PRIDE_YELLOW: RGB<I8F8> = RGB {
    r: I8F8::lit("1.0"),
    g: I8F8::lit("0.85"),
    b: I8F8::lit("0"),
};

pub const PRIDE_GREEN: RGB<I8F8> = RGB {
    r: I8F8::lit("0"),
    g: I8F8::lit("0.95"),
    b: I8F8::lit("0.05"),
};

pub const PRIDE_INDIGO: RGB<I8F8> = RGB {
    r: I8F8::lit("0.04"),
    g: I8F8::lit("0.15"),
    b: I8F8::lit("0.55"),
};

pub const PRIDE_VIOLET: RGB<I8F8> = RGB {
    r: I8F8::lit("0.75"),
    g: I8F8::lit("0.0"),
    b: I8F8::lit("0.80"),
};

pub const TRANS_BLUE: RGB<I8F8> = RGB {
    r: I8F8::lit("0.06"),
    g: I8F8::lit("0.41"),
    b: I8F8::lit("0.98"),
};

pub const TRANS_PINK: RGB<I8F8> = RGB {
    r: I8F8::lit("0.96"),
    g: I8F8::lit("0.16"),
    b: I8F8::lit("0.32"),
};

pub const WATER_1: RGB<I8F8> = RGB {
    r: I8F8::lit("0.0"),
    g: I8F8::lit("0.0"),
    b: I8F8::lit("0.75"),
};

pub const WATER_2: RGB<I8F8> = RGB {
    r: I8F8::lit("0.8"),
    g: I8F8::lit("0.8"),
    b: I8F8::lit("0.8"),
};

pub const WATER_3: RGB<I8F8> = RGB {
    r: I8F8::lit("0.00"),
    g: I8F8::lit("0.75"),
    b: I8F8::lit("0.75"),
};

pub const OFF_DASHBOARD: DashboardPattern = [RGB_OFF; 3];
pub const OFF_BODY: BodyPattern = [RGB_OFF; 60];

pub const DEFAULT_FRAMES: U16F0 = U16F0::lit("30");

pub const WATER_DASHBOARD: DashboardPattern = [WATER_1, WATER_2, WATER_3];

pub const WATER_BODY: BodyPattern = [RGB_OFF; 60];

pub const PRIDE_DASHBOARD: DashboardPattern = [PRIDE_RED, PRIDE_GREEN, PRIDE_INDIGO];

pub const PRIDE_BODY: BodyPattern = [
    // Left Side
    // Red
    PRIDE_RED,
    PRIDE_RED,
    PRIDE_RED,
    PRIDE_RED,
    PRIDE_RED,
    // Orange
    PRIDE_ORANGE,
    PRIDE_ORANGE,
    PRIDE_ORANGE,
    PRIDE_ORANGE,
    PRIDE_ORANGE,
    // Yellow
    PRIDE_YELLOW,
    PRIDE_YELLOW,
    PRIDE_YELLOW,
    PRIDE_YELLOW,
    PRIDE_YELLOW,
    // Green
    PRIDE_GREEN,
    PRIDE_GREEN,
    PRIDE_GREEN,
    PRIDE_GREEN,
    PRIDE_GREEN,
    // Indigo
    PRIDE_INDIGO,
    PRIDE_INDIGO,
    PRIDE_INDIGO,
    PRIDE_INDIGO,
    PRIDE_INDIGO,
    // Violet
    PRIDE_VIOLET,
    PRIDE_VIOLET,
    PRIDE_VIOLET,
    PRIDE_VIOLET,
    PRIDE_VIOLET,
    // Right Side
    // Violet
    PRIDE_VIOLET,
    PRIDE_VIOLET,
    PRIDE_VIOLET,
    PRIDE_VIOLET,
    PRIDE_VIOLET,
    // Indigo
    PRIDE_INDIGO,
    PRIDE_INDIGO,
    PRIDE_INDIGO,
    PRIDE_INDIGO,
    PRIDE_INDIGO,
    // Green
    PRIDE_GREEN,
    PRIDE_GREEN,
    PRIDE_GREEN,
    PRIDE_GREEN,
    PRIDE_GREEN,
    // Yellow
    PRIDE_YELLOW,
    PRIDE_YELLOW,
    PRIDE_YELLOW,
    PRIDE_YELLOW,
    PRIDE_YELLOW,
    // Orange
    PRIDE_ORANGE,
    PRIDE_ORANGE,
    PRIDE_ORANGE,
    PRIDE_ORANGE,
    PRIDE_ORANGE,
    // Red
    PRIDE_RED,
    PRIDE_RED,
    PRIDE_RED,
    PRIDE_RED,
    PRIDE_RED,
];

pub const TRANS_PRIDE_DASHBOARD: DashboardPattern = [TRANS_BLUE, RGB_WHITE, TRANS_PINK];

pub const TRANS_PRIDE_BODY: BodyPattern = [
    // Left Side
    TRANS_BLUE, TRANS_BLUE, TRANS_BLUE, TRANS_BLUE, TRANS_BLUE, TRANS_BLUE, TRANS_PINK, TRANS_PINK,
    TRANS_PINK, TRANS_PINK, TRANS_PINK, TRANS_PINK, RGB_WHITE, RGB_WHITE, RGB_WHITE, RGB_WHITE,
    RGB_WHITE, RGB_WHITE, TRANS_PINK, TRANS_PINK, TRANS_PINK, TRANS_PINK, TRANS_PINK, TRANS_PINK,
    TRANS_BLUE, TRANS_BLUE, TRANS_BLUE, TRANS_BLUE, TRANS_BLUE, TRANS_BLUE,
    // Right side
    TRANS_BLUE, TRANS_BLUE, TRANS_BLUE, TRANS_BLUE, TRANS_BLUE, TRANS_BLUE, TRANS_PINK, TRANS_PINK,
    TRANS_PINK, TRANS_PINK, TRANS_PINK, TRANS_PINK, RGB_WHITE, RGB_WHITE, RGB_WHITE, RGB_WHITE,
    RGB_WHITE, RGB_WHITE, TRANS_PINK, TRANS_PINK, TRANS_PINK, TRANS_PINK, TRANS_PINK, TRANS_PINK,
    TRANS_BLUE, TRANS_BLUE, TRANS_BLUE, TRANS_BLUE, TRANS_BLUE, TRANS_BLUE,
];

pub const BRAKES_FRAMES: U16F0 = U16F0::lit("15");

pub const BRAKES_DASHBOARD: DashboardPattern = [BRAKES_RED; 3];

pub const BRAKES_BODY: BodyPattern = [BRAKES_RED; 60];

pub const BLINKER_FRAMES: U16F0 = U16F0::lit("10");

pub const LEFT_BLINKER_DASHBOARD: DashboardPattern = [BLINKER_AMBER, RGB_OFF, RGB_OFF];

pub const LEFT_BLINKER_BODY: BodyPattern = [
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
];

pub const RIGHT_BLINKER_DASHBOARD: DashboardPattern = [RGB_OFF, RGB_OFF, BLINKER_AMBER];

pub const RIGHT_BLINKER_BODY: BodyPattern = [
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    RGB_OFF,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
    BLINKER_AMBER,
];
