import hid
import logging
from extended_mode_display.direct_mode import enable_direct_mode
import time
from enum import Enum
from extended_mode_display.direct_mode_display import DirectModeDisplay
from extended_mode_display.hid_commands import (
    get_bigs_device,
    disable_display_power,
    enable_display_power,
)

logging.basicConfig(
    level=logging.DEBUG, format="%(asctime)s - %(levelname)s - %(message)s"
)
log = logging.getLogger(__name__)


class DisplayRates(Enum):
    BOTH = 0
    hz90 = 1
    hz75 = 2


# TODO: move the remaining hid functions to hid_commands.py


def set_edid_to_native(display_rate: DisplayRates):
    bigs = get_bigs_device()
    bigs.send_feature_report(bytes([0, ord("d"), display_rate.value]))
    time.sleep(5)  # resets the vxr7200 and takes a few seconds to come back up
    bigs.close()


def disable_proximity():
    bigs = get_bigs_device()
    bigs.send_feature_report(bytes([0, ord("p")]))
    bigs.close()


def enable_displays():
    bigs = get_bigs_device()
    bigs.send_feature_report(
        bytes([0, ord("o"), 0, 1, 0x29])
    )  # Display_On command to the left display
    bigs.send_feature_report(
        bytes([0, ord("o"), 1, 1, 0x29])
    )  # Display_On command to the right display
    bigs.close()


def set_decorative_LED_to_black():
    bigs = get_bigs_device()
    bigs.send_feature_report(bytes([0, ord("L"), 0x00, 0x00, 0x00]))
    bigs.close()


def set_decorative_LED_to_dim_green():
    bigs = get_bigs_device()
    bigs.send_feature_report(bytes([0, ord("L"), 0x00, 0x01, 0x00]))
    bigs.close()


def set_display_duty_to_100():
    bigs = get_bigs_device()
    bigs.send_feature_report(bytes([0, ord("I"), 0x03, 0xFF]))
    bigs.close()


def set_display_duty_to_10():
    bigs = get_bigs_device()
    bigs.send_feature_report(bytes([0, ord("I"), 0x00, 0x66]))
    bigs.close()


class DisplayPowerManager:
    def __enter__(self):
        enable_display_power()
        time.sleep(3)
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        disable_display_power()


def prepare_headset_for_measurement(
    display_rate=DisplayRates.hz75,
) -> DirectModeDisplay:
    if display_rate == DisplayRates.BOTH or display_rate == DisplayRates.hz90:
        log.warning("90hz has not been tested, use at own risk")
    log.info("Preparing headset for measurement")
    log.debug(f"setting EDID to {display_rate}")
    set_edid_to_native(display_rate)
    dmd = DirectModeDisplay()
    log.debug("setting decorative LED to dim green")
    set_decorative_LED_to_dim_green()
    log.debug("Setting Display Duty to 100%")
    set_display_duty_to_100()
    time.sleep(3)
    log.debug("Disabling proximity sensor")
    disable_proximity()
    return dmd


if __name__ == "__main__":
    prepare_headset_for_measurement()
