"""Command definitions."""

# pylint: disable=line-too-long

from .base import (
    Command,
    LaserPowerParameter,
    LightTimeParameter,
    MacAddressParameter,
    MapParameter,
    Model,
    ModelParameter,
    Spec,
    VersionParameter,
)

# SPECIFICATIONS:
# * Spec name is the year of the model release followed by an incremental sequence number.
# * Model name is really a model series/family since there is no way to know the exact model.
# * Model can be a list of models when they could go by different names (like in CS20191)
# * At runtime a projector model is matched to a spec in the order given below (e.g., B8A2, B8A1, B5A3, ...)
#   - First an exact match from top to bottom is done. If no match is found then:
#   - A partial match of the first 3 characters is done top to bottom. (e.g., B5A9 would match B5A3)
#   - If no match is found, the projector is considered to be in limp mode, with minimal command support.

# fmt: off
SPECIFICATIONS: tuple[Spec, ...] = (
    CS20241 := Spec(
        "CS20241",
        B8A2 := Model("B8A2"),  # RS3200, NZ800, N988, V800R
        B8A1 := Model("B8A1"),  # RS4200, NZ900, N1188, V900R
    ),
    CS20242 := Spec(
        "CS20242",
        D8A2 := Model("D8A2"),  # NZ500, RS1200, N799, N788, N700, Z5
        D8A1 := Model("D8A1"),  # NZ700, RS2200, N899, N888, N800, Z7
    ),
    CS20221 := Spec(
        "CS20221",
        B5A3 := Model("B5A3"),  # RS2100, NZ7, N88, V70R
        B5A2 := Model("B5A2"),  # RS3100, NZ8, N98, V80R
        B5A1 := Model("B5A1"),  # RS4100, NZ9, N11, V90R
        B5B1 := Model("B5B1"),  # RS1100, NP5, N78, V50
    ),
    CS20191 := Spec(
        "CS20191",
        B2A3 := Model("B2A3", "A2B3"),  # RS1000, NX5, N5, N6, V5
        B2A2 := Model("B2A2", "A2B2"),  # RS2000, NX7, N7, N8, V7
        B2A1 := Model("B2A1", "A2B1"),  # RS3000, NX9, NX11, V9R
    ),
    CS20172 := Spec(
        "CS20172",
        A0A0 := Model("A0A0"),  # Z1, RS4500
    ),
    CS20171 := Spec(
        "CS20171",
        XHR1 := Model("XHR1", "XHS1"),  # X570R, RS420, X590R, RS440
        XHR3 := Model("XHR3", "XHS3"),  # X770R, X970, X970R, RS520, RS620, X790R, X990R, RS540, RS640
    ),
    CS20161 := Spec(
        "CS20161",
        XHP1 := Model("XHP1"),  # X550R, X5000, XC5890R, RS400
        XHP2 := Model("XHP2"),  # XC6890, XC6890R
        XHP3 := Model("XHP3"),  # X750R, X7000, XC7890R, RS500, X950R, X9000, RS600, PX1
    ),
    CS20141 := Spec(
        "CS20141",
        XHK1 := Model("XHK1"),  # X500R, XC5880R, RS49
        XHK2 := Model("XHK2"),  # RS4910
        XHK3 := Model("XHK3"),  # X700R, X7880R, XC7880R, RS57, X900R, RS67, RS6710
    ),
    CS20131 := Spec(
        "CS20131",
        XHG1 := Model("XHG1"),  # X35, XC3800, RS46, RS4810
        XHH1 := Model("XHH1"),  # X55R, XC5800R, RS48
        XHH4 := Model("XHH4"),  # X75R, XC7800R, RS56, X95R, XC9800R, RS66
    ),
    CS20121 := Spec(
        "CS20121",
        XHE := Model("XHE"),  # X30, XC388, RS45, RS4800
        XHF := Model("XHF"),  # X70R, XC788R, RS55, X90R, XC988R, RS65
    ),
)
# fmt: on


class ModelName(Command):
    """Model command."""

    code = "MD"
    reference = True
    operation = False
    limp_mode = True
    parameter = ModelParameter()


class MacAddress(Command):
    """Mac Address command."""

    code = "LSMA"
    reference = True
    operation = False
    limp_mode = True
    parameter = MacAddressParameter()


class Version(Command):
    """Software Version command."""

    code = "IFSV"
    reference = True
    operation = False
    limp_mode = True
    parameter = VersionParameter()


class Power(Command):
    """Power command."""

    code = "PW"
    reference = True
    operation = True
    limp_mode = True

    OFF = "off"
    ON = "on"
    STANDBY = "standby"
    COOLING = "cooling"
    WARMING = "warming"
    ERROR = "error"

    parameter = MapParameter(
        size=1,
        read={
            "0": STANDBY,
            "1": ON,
            "2": COOLING,
            "3": WARMING,
            "4": ERROR,
        },
        write={
            "0": OFF,
            "1": ON,
        },
    )


class Input(Command):
    """Input command."""

    code = "IP"
    reference = True
    operation = True
    operation_timeout = 10.0
    limp_mode = True

    HDMI1 = "hdmi1"
    HDMI2 = "hdmi2"
    COMP = "comp"
    PC = "pc"

    parameter = MapParameter(
        size=1,
        readwrite={
            "6": HDMI1,
            "7": HDMI2,
        },
    )


class Signal(Command):
    """Signal command."""

    code = "SC"
    reference = True
    operation = False
    limp_mode = True

    NONE = "none"
    SIGNAL = "signal"

    parameter = MapParameter(
        size=1,
        read={
            "0": NONE,
            "1": SIGNAL,
        },
    )


class LightTime(Command):
    """Light Time (Lamp/Laser) command."""

    code = "IFLT"
    reference = True
    operation = False
    limp_mode = True
    parameter = LightTimeParameter()


class Remote(Command):
    """Remote command."""

    code = "RC"
    reference = False
    operation = True
    limp_mode = True

    OK = "ok"
    MENU = "menu"
    BACK = "back"
    HIDE = "hide"
    UP = "up"
    DOWN = "down"
    LEFT = "left"
    RIGHT = "right"
    INFO = "info"
    INPUT = "input"
    HDMI1 = "hdmi1"
    HDMI2 = "hdmi2"
    SETTING_MEMORY = "setting-memory"
    LENS_CONTROL = "lens-control"
    PICTURE_MODE = "picture-mode"
    COLOR_PROFILE = "color-profile"
    GAMMA_SETTINGS = "gamma-settings"
    CMD = "cmd"
    MPC = "mpc"
    ADVANCED_MENU = "advanced-menu"
    MODE_1 = "mode-1"
    MODE_2 = "mode-2"
    MODE_3 = "mode-3"
    MODE_4 = "mode-4"
    MODE_5 = "mode-5"
    MODE_6 = "mode-6"
    MODE_7 = "mode-7"
    MODE_8 = "mode-8"
    MODE_9 = "mode-9"
    MODE_10 = "mode-10"
    LENS_APERTURE = "lens-aperture"
    PICTURE_ADJUST = "picture-adjust"
    ANAMORPHIC = "anamorphic"
    GAMMA = "gamma"
    COLOR_TEMP = "color-temp"
    V3D_FORMAT = "3d-format"
    NATURAL = "natural"
    CINEMA = "cinema"

    parameter = MapParameter(
        size=4,
        write={
            "732F": OK,
            "732E": MENU,
            "7303": BACK,
            "731D": HIDE,
            "7301": UP,
            "7302": DOWN,
            "7336": LEFT,
            "7334": RIGHT,
            "7374": INFO,
            "7308": INPUT,
            "7370": HDMI1,
            "7371": HDMI2,
            "73D4": SETTING_MEMORY,
            "7330": LENS_CONTROL,
            "73F4": PICTURE_MODE,
            "7388": COLOR_PROFILE,
            "73F5": GAMMA_SETTINGS,
            "738A": CMD,
            "73F0": MPC,
            "7373": ADVANCED_MENU,
            "73D8": MODE_1,
            "73D9": MODE_2,
            "73DA": MODE_3,
            "73E5": MODE_4,
            "73E6": MODE_5,
            "73E7": MODE_6,
            "73E8": MODE_7,
            "73E9": MODE_8,
            "73EA": MODE_9,
            "73EB": MODE_10,
            "7320": LENS_APERTURE,
            "7372": PICTURE_ADJUST,
            "73C5": ANAMORPHIC,
            "7375": GAMMA,
            "7376": COLOR_TEMP,
            "73D6": V3D_FORMAT,
            "736A": NATURAL,
            "7368": CINEMA,
        },
    )


class PictureMode(Command):
    """Picture Mode command."""

    code = "PMPM"
    reference = True
    operation = True
    operation_timeout = 10.0

    ANIMATION = "animation"
    CINEMA = "cinema"
    FILM = "film"
    FILMMAKER_MODE = "filmmaker-mode"
    FRAME_ADAPT_HDR = "frame-adapt-hdr"
    FRAME_ADAPT_HDR2 = "frame-adapt-hdr2"
    FRAME_ADAPT_HDR3 = "frame-adapt-hdr3"
    HDR = "hdr"
    HDR1 = "hdr1"
    HDR2 = "hdr2"
    HDR10 = "hdr10"
    HDR10_LL = "hdr10-ll"
    HDR10_PLUS = "hdr10+"
    HLG = "hlg"
    HLG_LL = "hlg-ll"
    ISF_DAY = "isf-day"
    ISF_NIGHT = "isf-night"
    NATURAL = "natural"
    NATURAL_LL = "natural-ll"
    PANA_PQ = "pana-pq"
    PHOTO = "photo"
    RESERVED = "reserved"
    SDR_1 = "sdr-1"
    SDR_2 = "sdr-2"
    STAGE = "stage"
    THX = "thx"
    THX_BRIGHT = "thx-bright"
    THX_DARK = "thx-dark"
    USER_1 = "user-1"
    USER_2 = "user-2"
    USER_3 = "user-3"
    USER_4 = "user-4"
    USER_5 = "user-5"
    USER_6 = "user-6"
    VIVID = "vivid"
    THREE_D = "3d"
    R4K = "4k"

    parameter = {
        CS20241: MapParameter(
            size=2,
            readwrite={
                "00": FILM,
                "01": CINEMA,
                "03": NATURAL,
                "04": HDR10,
                "0B": FRAME_ADAPT_HDR,
                "0C": USER_1,
                "0D": USER_2,
                "0E": USER_3,
                "0F": USER_4,
                "10": USER_5,
                "11": USER_6,
                "14": HLG,
                "15": HDR10_PLUS,
                "17": FILMMAKER_MODE,
                "18": FRAME_ADAPT_HDR2,
                "19": FRAME_ADAPT_HDR3,
                "1B": VIVID,
                "1C": NATURAL_LL,
                "1D": HDR10_LL,
                "1E": HLG_LL,
            },
        ),
        CS20242: MapParameter(
            size=2,
            readwrite={
                "01": CINEMA,
                "03": NATURAL,
                "0B": FRAME_ADAPT_HDR,
                "0C": SDR_1,
                "0D": SDR_2,
                "0E": HDR1,
                "0F": HDR2,
                "14": HLG,
                "15": HDR10_PLUS,
                "17": FILMMAKER_MODE,
                "18": FRAME_ADAPT_HDR2,
                "1B": VIVID,
            },
        ),
        CS20221: MapParameter(
            size=2,
            readwrite={
                "00": (FILM, B5A1, B5A2),
                "01": CINEMA,
                "03": NATURAL,
                "04": HDR10,
                "0B": FRAME_ADAPT_HDR,
                "0C": USER_1,
                "0D": USER_2,
                "0E": USER_3,
                "0F": USER_4,
                "10": USER_5,
                "11": USER_6,
                "14": HLG,
                "15": HDR10_PLUS,
                "16": PANA_PQ,
                "17": FILMMAKER_MODE,
                "18": FRAME_ADAPT_HDR2,
                "19": FRAME_ADAPT_HDR3,
            },
        ),
        CS20191: MapParameter(
            size=2,
            readwrite={
                "00": (FILM, B2A1, B2A2),
                "01": CINEMA,
                "03": NATURAL,
                "04": HDR10,
                "06": (THX, B2A1),
                "0B": FRAME_ADAPT_HDR,
                "0C": USER_1,
                "0D": USER_2,
                "0E": USER_3,
                "0F": USER_4,
                "10": USER_5,
                "11": USER_6,
                "14": HLG,
                "16": PANA_PQ,
            },
        ),
        CS20172: MapParameter(
            size=2,
            readwrite={
                "00": FILM,
                "01": CINEMA,
                "03": NATURAL,
                "04": HDR,
                "06": THX,
                "0C": USER_1,
                "0D": USER_2,
                "0E": USER_3,
                "0F": USER_4,
                "10": USER_5,
                "11": USER_6,
            },
        ),
        CS20171: MapParameter(
            size=2,
            readwrite={
                "00": (FILM, XHR3),
                "01": CINEMA,
                "02": ANIMATION,
                "03": NATURAL,
                "04": HDR,
                "06": (THX, XHR3),
                "0C": USER_1,
                "0D": USER_2,
                "0E": USER_3,
                "0F": USER_4,
                "10": USER_5,
            },
        ),
        CS20161: MapParameter(
            size=2,
            readwrite={
                "00": (FILM, XHP3),
                "01": CINEMA,
                "02": ANIMATION,
                "03": NATURAL,
                "06": (THX, XHP3),
                "0C": USER_1,
                "0D": USER_2,
                "0E": USER_3,
                "0F": USER_4,
                "10": USER_5,
                "11": USER_6,
            },
        ),
        CS20141: MapParameter(
            size=2,
            read={
                "00": (FILM, XHK3),
                "01": CINEMA,
                "02": ANIMATION,
                "03": NATURAL,
                "04": STAGE,
                "06": (THX, XHK3),
                "0B": R4K,
                "0C": USER_1,
                "0D": USER_2,
                "0E": USER_3,
                "0F": USER_4,
                "12": (PHOTO, XHK3),
            },
            write={
                "00": (FILM, XHK3),
                "01": CINEMA,
                "02": ANIMATION,
                "03": NATURAL,
                "04": STAGE,
                "06": (THX, XHK3),
                "0C": USER_1,
                "0D": USER_2,
                "0E": USER_3,
                "0F": USER_4,
                "12": (PHOTO, XHK3),
            },
        ),
        CS20131: MapParameter(
            size=2,
            readwrite={
                "00": FILM,
                "01": CINEMA,
                "02": ANIMATION,
                "03": NATURAL,
                "04": STAGE,
                "05": RESERVED,
                "06": THX,
                "07": (ISF_DAY, XHH4),
                "08": (ISF_NIGHT, XHH4),
                "09": (THX_BRIGHT, XHH4),
                "0A": (THX_DARK, XHH4),
                "0B": THREE_D,
                "0C": USER_1,
                "0D": USER_2,
                "0E": USER_3,
                "0F": USER_4,
                "10": USER_5,
            },
        ),
        CS20121: MapParameter(
            size=2,
            readwrite={
                "00": FILM,
                "01": CINEMA,
                "02": ANIMATION,
                "03": NATURAL,
                "04": STAGE,
                "05": RESERVED,
                "06": THX,
                "07": (ISF_DAY, XHF),
                "08": (ISF_NIGHT, XHF),
                "09": (THX_BRIGHT, XHF),
                "0A": (THX_DARK, XHF),
                "0B": THREE_D,
                "0C": USER_1,
                "0D": USER_2,
                "0E": USER_3,
                "0F": USER_4,
                "10": USER_5,
            },
        ),
    }


class IntelligentLensAperture(Command):
    """Intelligent Lens Aperture command."""

    code = "PMDI"
    reference = True
    operation = True

    OFF = "off"
    AUTO_1 = "auto-1"
    AUTO_2 = "auto-2"

    parameter = {
        CS20221: MapParameter(
            size=1,
            readwrite={
                "0": (OFF, B5B1),
                "1": (AUTO_1, B5B1),
                "2": (AUTO_2, B5B1),
            },
        ),
        (CS20191, CS20171, CS20161, CS20141): MapParameter(
            size=1,
            readwrite={
                "0": OFF,
                "1": AUTO_1,
                "2": AUTO_2,
            },
        ),
    }


class ColorProfile(Command):
    """Color Profile command."""

    code = "PMPR"
    reference = True
    operation = True

    ADOBE = "adobe"
    ANIME = "anime"
    ANIME_1 = "anime-1"
    ANIME_2 = "anime-2"
    AUTO = "auto"
    BT_2020 = "bt-2020"
    BT_2020_NORMAL = "bt-2020-normal"
    BT_2020_WIDE = "bt-2020-wide"
    BT_709 = "bt-709"
    CINEMA = "cinema"
    CINEMA_1 = "cinema-1"
    CINEMA_2 = "cinema-2"
    CUSTOM_1 = "custom-1"
    CUSTOM_2 = "custom-2"
    CUSTOM_3 = "custom-3"
    CUSTOM_4 = "custom-4"
    CUSTOM_5 = "custom-5"
    CUSTOM_6 = "custom-6"
    DCI = "dci"
    FILM = "film"
    FILM_1 = "film-1"
    FILM_2 = "film-2"
    FILM_3 = "film-3"
    HDR = "hdr"
    NATURAL = "natural"
    OFF = "off"
    OFF_WIDE = "off-wide"
    PANA_PQ_BL = "pana-pq-bl"
    PANA_PQ_HL = "pana-pq-hl"
    REFERENCE = "reference"
    STAGE = "stage"
    STANDARD = "standard"
    THX = "thx"
    VIDEO = "video"
    VIVID = "vivid"
    THREE_D = "3d"
    THREE_D_ANIMATION = "3d-animation"
    THREE_D_ANIME = "3d-anime"
    THREE_D_CINEMA = "3d-cinema"
    THREE_D_FILM = "3d-film"
    THREE_D_PHOTO = "3d-photo"
    THREE_D_STAGE = "3d-stage"
    THREE_D_THX = "3d-thx"
    THREE_D_VIDEO = "3d-video"
    XV_COLOR = "xv-color"

    parameter = {
        CS20241: MapParameter(
            size=2,
            readwrite={
                "00": OFF,
                "01": FILM_1,
                "02": FILM_2,
                "03": BT_709,
                "04": CINEMA,
                "06": ANIME,
                "08": VIDEO,
                "0B": BT_2020_WIDE,
                "0E": CUSTOM_1,
                "0F": CUSTOM_2,
                "10": CUSTOM_3,
                "11": CUSTOM_4,
                "21": DCI,
                "23": VIVID,
                "24": BT_2020_NORMAL,
                "25": OFF_WIDE,
                "26": AUTO,
            },
        ),
        CS20242: MapParameter(
            size=2,
            readwrite={
                "00": OFF,
                "03": BT_709,
                "04": CINEMA,
                "06": (ANIME, D8A1),
                "08": VIDEO,
                "0B": (BT_2020_WIDE, D8A1),
                "0E": CUSTOM_1,
                "0F": CUSTOM_2,
                "10": CUSTOM_3,
                "11": CUSTOM_4,
                "21": DCI,
                "23": VIVID,
                "24": BT_2020_NORMAL,
                "25": (OFF_WIDE, D8A1),
                "26": AUTO,
            },
        ),
        CS20221: MapParameter(
            size=2,
            readwrite={
                "00": OFF,
                "01": (FILM_1, B5A1, B5A2),
                "02": (FILM_2, B5A1, B5A2),
                "03": BT_709,
                "04": CINEMA,
                "06": (ANIME, B5A1, B5A2),
                "08": VIDEO,
                "0B": (BT_2020_WIDE, B5A1, B5A2),
                "0E": CUSTOM_1,
                "0F": CUSTOM_2,
                "10": CUSTOM_3,
                "11": CUSTOM_4,
                "12": CUSTOM_5,
                "21": DCI,
                "22": CUSTOM_6,
                "24": BT_2020_NORMAL,
                "25": (OFF_WIDE, B5A1, B5A2),
                "26": AUTO,
            },
        ),
        CS20191: MapParameter(
            size=2,
            readwrite={
                "00": OFF,
                "01": (FILM_1, B2A1, B2A2),
                "02": (FILM_2, B2A1, B2A2),
                "03": BT_709,
                "04": CINEMA,
                "06": (ANIME, B2A1, B2A2),
                "08": VIDEO,
                "0A": HDR,
                "0B": (BT_2020_WIDE, B2A1, B2A2),
                "0D": (THX, B2A1),
                "0E": CUSTOM_1,
                "0F": CUSTOM_2,
                "10": CUSTOM_3,
                "11": CUSTOM_4,
                "12": PANA_PQ_HL,
                "21": DCI,
                "22": PANA_PQ_BL,
                "24": BT_2020_NORMAL,
                "25": (OFF_WIDE, B2A1, B2A2),
                "26": AUTO,
            },
        ),
        CS20172: MapParameter(
            size=2,
            readwrite={
                "00": OFF,
                "01": FILM_1,
                "02": FILM_2,
                "03": BT_709,
                "04": CINEMA,
                "06": ANIME,
                "0A": HDR,
                "0B": BT_2020,
                "0D": THX,
                "0E": CUSTOM_1,
                "0F": CUSTOM_2,
                "10": CUSTOM_3,
                "11": CUSTOM_4,
                "12": CUSTOM_5,
                "21": DCI,
                "22": CUSTOM_6,
            },
        ),
        CS20171: MapParameter(
            size=2,
            readwrite={
                "00": OFF,
                "01": (FILM_1, XHR3),
                "02": (FILM_2, XHR3),
                "03": STANDARD,
                "04": CINEMA_1,
                "05": (CINEMA_2, XHR3),
                "06": ANIME_1,
                "07": (ANIME_2, XHR3),
                "08": VIDEO,
                "09": XV_COLOR,
                "0B": BT_2020,
                "0C": THREE_D_CINEMA,
                "0D": (THX, XHR3),
                "0E": CUSTOM_1,
                "0F": CUSTOM_2,
                "10": CUSTOM_3,
                "11": CUSTOM_4,
                "12": CUSTOM_5,
                "13": (FILM_3, XHR3),
                "14": THREE_D_VIDEO,
                "15": THREE_D_ANIMATION,
                "1E": (THREE_D_FILM, XHR3),
                "20": (THREE_D_THX, XHR3),
                "21": (REFERENCE, XHR3),
            },
        ),
        CS20161: MapParameter(
            size=2,
            readwrite={
                "00": OFF,
                "01": (FILM_1, XHP3),
                "02": (FILM_2, XHP3),
                "03": STANDARD,
                "04": CINEMA_1,
                "05": (CINEMA_2, XHP3),
                "06": ANIME_1,
                "07": (ANIME_2, XHP3),
                "08": VIDEO,
                "09": (XV_COLOR, XHP3),
                "0C": THREE_D_CINEMA,
                "0D": (THX, XHP3),
                "0E": CUSTOM_1,
                "0F": CUSTOM_2,
                "10": CUSTOM_3,
                "11": CUSTOM_4,
                "12": CUSTOM_5,
                "13": (FILM_3, XHP3),
                "14": THREE_D_VIDEO,
                "15": THREE_D_ANIMATION,
                "1E": (THREE_D_FILM, XHP3),
                "20": (THREE_D_THX, XHP3),
                "21": (REFERENCE, XHP3),
                "22": CUSTOM_6,
            },
        ),
        CS20141: MapParameter(
            size=2,
            readwrite={
                "00": OFF,
                "01": (FILM_1, XHK3),
                "02": (FILM_2, XHK3),
                "03": STANDARD,
                "04": CINEMA_1,
                "05": (CINEMA_2, XHK3),
                "06": ANIME_1,
                "07": (ANIME_2, XHK3),
                "08": VIDEO,
                "09": (XV_COLOR, XHK3),
                "0A": (ADOBE, XHK3),
                "0B": STAGE,
                "0C": THREE_D_CINEMA,
                "0D": (THX, XHK3),
                "0E": CUSTOM_1,
                "0F": CUSTOM_2,
                "10": CUSTOM_3,
                "11": CUSTOM_4,
                "12": CUSTOM_5,
                "13": (FILM_3, XHK3),
                "14": THREE_D_VIDEO,
                "15": THREE_D_ANIME,
                "16": (THREE_D_PHOTO, XHK3),
                "1E": (THREE_D_FILM, XHK3),
                "1F": (THREE_D_STAGE, XHK3),
                "20": (THREE_D_THX, XHK3),
            },
        ),
        CS20131: MapParameter(
            size=2,
            readwrite={
                "00": (OFF, XHH4),
                "01": (FILM_1, XHH4),
                "02": (FILM_2, XHH4),
                "03": (STANDARD, XHH4),
                "04": (CINEMA_1, XHH4),
                "05": (CINEMA_2, XHH4),
                "06": (ANIME_1, XHH4),
                "07": (ANIME_2, XHH4),
                "08": (VIDEO, XHH4),
                "09": (VIVID, XHH4),
                "0A": (ADOBE, XHH4),
                "0B": (STAGE, XHH4),
                "0C": (THREE_D_CINEMA, XHH4),
                "0D": (THX, XHH4),
                "0E": (CUSTOM_1, XHH4),
                "0F": (CUSTOM_2, XHH4),
                "10": (CUSTOM_3, XHH4),
                "11": (CUSTOM_4, XHH4),
                "12": (CUSTOM_5, XHH4),
                "13": (FILM_3, XHH4),
                "14": (THREE_D_VIDEO, XHH4),
                "15": (THREE_D_ANIME, XHH4),
                "16": (STANDARD, XHH1),
                "17": (FILM, XHH1),
                "18": (CINEMA, XHH1),
                "19": (ANIME, XHH1),
                "1A": (NATURAL, XHH1),
                "1B": (STAGE, XHH1),
                "1C": (THREE_D, XHH1),
                "1D": (OFF, XHH1),
            },
        ),
        CS20121: MapParameter(
            size=2,
            readwrite={
                "00": (OFF, XHF),
                "01": (FILM_1, XHF),
                "02": (FILM_2, XHF),
                "03": (STANDARD, XHF),
                "04": (CINEMA_1, XHF),
                "05": (CINEMA_2, XHF),
                "06": (ANIME_1, XHF),
                "07": (ANIME_2, XHF),
                "08": (VIDEO, XHF),
                "09": (VIVID, XHF),
                "0A": (ADOBE, XHF),
                "0B": (STAGE, XHF),
                "0C": (THREE_D, XHF),
                "0D": (THX, XHF),
                "0E": (CUSTOM_1, XHF),
                "0F": (CUSTOM_2, XHF),
                "10": (CUSTOM_3, XHF),
                "11": (CUSTOM_4, XHF),
                "12": (CUSTOM_5, XHF),
            },
        ),
    }


class ColorManagement(Command):
    """Color Management command."""

    code = "PMCB"
    reference = True
    operation = True

    OFF = "off"
    ON = "on"
    CUSTOM_1 = "custom-1"
    CUSTOM_2 = "custom-2"
    CUSTOM_3 = "custom-3"

    parameter = {
        (CS20241, CS20242, CS20221, CS20191, CS20172, CS20171, CS20161): MapParameter(
            size=1,
            readwrite={
                "0": OFF,
                "1": ON,
            },
        ),
        CS20141: MapParameter(
            size=1,
            readwrite={
                "0": OFF,
                "1": CUSTOM_1,
                "2": CUSTOM_2,
                "3": CUSTOM_3,
            },
        ),
        CS20131: MapParameter(
            size=1,
            readwrite={
                "0": OFF,
                "1": (CUSTOM_1, XHH4),
                "2": (CUSTOM_2, XHH4),
                "3": (CUSTOM_3, XHH4),
            },
        ),
        CS20121: MapParameter(
            size=1,
            readwrite={
                "0": OFF,
                "1": (CUSTOM_1, XHF),
                "2": (CUSTOM_2, XHF),
                "3": (CUSTOM_3, XHF),
            },
        ),
    }


class ColorTemperature(Command):
    """Color Temperature command."""

    code = "PMCL"
    reference = True
    operation = True

    CUSTOM_1 = "custom-1"
    CUSTOM_2 = "custom-2"
    CUSTOM_3 = "custom-3"
    HDR = "hdr"
    HDR10 = "hdr10"
    HDR10_PLUS = "hdr10+"
    HIGH_BRIGHT = "high-bright"
    HLG = "hlg"
    VIVID = "vivid"
    T5500K = "5500k"
    T6000K = "6000k"
    T6500K = "6500k"
    T7000K = "7000k"
    T7500K = "7500k"
    T8000K = "8000k"
    T8500K = "8500k"
    T9000K = "9000k"
    T9300K = "9300k"
    T9500K = "9500k"
    XENON_1 = "xenon-1"
    XENON_2 = "xenon-2"
    XENON_3 = "xenon-3"

    parameter = {
        CS20241: MapParameter(
            size=2,
            readwrite={
                "00": T5500K,
                "02": T6500K,
                "04": T7500K,
                "08": T9300K,
                "09": HIGH_BRIGHT,
                "0A": CUSTOM_1,
                "0B": CUSTOM_2,
                "0C": HDR10,
                "0D": XENON_1,
                "0E": XENON_2,
                "14": HLG,
                "15": HDR10_PLUS,
            },
        ),
        CS20242: MapParameter(
            size=2,
            readwrite={
                "00": T5500K,
                "02": T6500K,
                "04": T7500K,
                "08": T9300K,
                "09": HIGH_BRIGHT,
                "0A": CUSTOM_1,
                "0B": CUSTOM_2,
                "0C": HDR10,
                "0D": (XENON_1, D8A1),
                "0E": (XENON_2, D8A1),
                "14": HLG,
                "15": HDR10_PLUS,
            },
        ),
        CS20221: MapParameter(
            size=2,
            readwrite={
                "00": T5500K,
                "02": T6500K,
                "04": T7500K,
                "08": T9300K,
                "09": HIGH_BRIGHT,
                "0A": (CUSTOM_1, B5A1, B5A2, B5B1),
                "0B": CUSTOM_2,
                "0C": HDR10,
                "0D": (XENON_1, B5A1, B5A2),
                "0E": (XENON_2, B5A1, B5A2),
                "14": HLG,
                "15": HDR10_PLUS,
            },
        ),
        CS20191: MapParameter(
            size=2,
            readwrite={
                "00": T5500K,
                "02": T6500K,
                "04": T7500K,
                "08": T9300K,
                "09": HIGH_BRIGHT,
                "0A": (CUSTOM_1, B2A1, B2A2),
                "0B": CUSTOM_2,
                "0C": HDR10,
                "0D": (XENON_1, B2A1, B2A2),
                "0E": (XENON_2, B2A1, B2A2),
                "14": HLG,
            },
        ),
        CS20172: MapParameter(
            size=2,
            readwrite={
                "00": T5500K,
                "02": T6500K,
                "04": T7500K,
                "08": T9300K,
                "09": HIGH_BRIGHT,
                "0A": CUSTOM_1,
                "0B": CUSTOM_2,
                "0C": HDR,
                "0D": XENON_1,
                "0E": XENON_2,
            },
        ),
        CS20171: MapParameter(
            size=1,
            readwrite={
                "0": T5500K,
                "2": T6500K,
                "4": T7500K,
                "8": T9300K,
                "9": HIGH_BRIGHT,
                "A": CUSTOM_1,
                "B": CUSTOM_2,
                "C": HDR,
                "D": XENON_1,
                "E": XENON_2,
                "F": XENON_3,
            },
        ),
        CS20161: MapParameter(
            size=1,
            readwrite={
                "0": T5500K,
                "2": T6500K,
                "4": T7500K,
                "8": T9300K,
                "9": HIGH_BRIGHT,
                "A": CUSTOM_1,
                "B": CUSTOM_2,
                "C": CUSTOM_3,
                "D": XENON_1,
                "E": XENON_2,
                "F": XENON_3,
            },
        ),
        (CS20141, CS20131, CS20121): MapParameter(
            size=1,
            readwrite={
                "0": T5500K,
                "1": T6000K,
                "2": T6500K,
                "3": T7000K,
                "4": T7500K,
                "5": T8000K,
                "6": T8500K,
                "7": T9000K,
                "8": T9500K,
                "9": HIGH_BRIGHT,
                "A": CUSTOM_1,
                "B": CUSTOM_2,
                "C": CUSTOM_3,
                "D": XENON_1,
                "E": XENON_2,
                "F": XENON_3,
            },
        ),
    }


class ColorTemperatureCorrection(Command):
    """Color Temperature Correction command."""

    code = "PMCC"
    reference = True
    operation = True

    HIGH_BRIGHT = "high-bright"
    T5500K = "5500k"
    T6000K = "6000k"
    T6500K = "6500k"
    T7000K = "7000k"
    T7500K = "7500k"
    T8000K = "8000k"
    T8500K = "8500k"
    T9000K = "9000k"
    T9300K = "9300k"
    T9500K = "9500k"
    XENON_1 = "xenon-1"
    XENON_2 = "xenon-2"
    XENON_3 = "xenon-3"

    parameter = {
        CS20241: MapParameter(
            size=2,
            readwrite={
                "00": T5500K,
                "02": T6500K,
                "04": T7500K,
                "08": T9300K,
                "09": HIGH_BRIGHT,
                "0D": XENON_1,
                "0E": XENON_2,
            },
        ),
        CS20242: MapParameter(
            size=2,
            readwrite={
                "00": T5500K,
                "02": T6500K,
                "04": T7500K,
                "08": T9300K,
                "09": HIGH_BRIGHT,
                "0D": (XENON_1, D8A1),
                "0E": (XENON_2, D8A1),
            },
        ),
        CS20221: MapParameter(
            size=2,
            readwrite={
                "00": T5500K,
                "02": T6500K,
                "04": T7500K,
                "08": T9300K,
                "09": HIGH_BRIGHT,
                "0D": (XENON_1, B5A1, B5A2),
                "0E": (XENON_2, B5A1, B5A2),
            },
        ),
        CS20191: MapParameter(
            size=2,
            readwrite={
                "00": T5500K,
                "02": T6500K,
                "04": T7500K,
                "08": T9300K,
                "09": HIGH_BRIGHT,
                "0D": (XENON_1, B2A1, B2A2),
                "0E": (XENON_2, B2A1, B2A2),
            },
        ),
        CS20172: MapParameter(
            size=2,
            readwrite={
                "00": T5500K,
                "02": T6500K,
                "04": T7500K,
                "08": T9300K,
                "09": HIGH_BRIGHT,
                "0D": XENON_1,
                "0E": XENON_2,
            },
        ),
        (CS20171, CS20161): MapParameter(
            size=1,
            readwrite={
                "0": T5500K,
                "2": T6500K,
                "4": T7500K,
                "8": T9300K,
                "9": HIGH_BRIGHT,
                "D": XENON_1,
                "E": XENON_2,
                "F": XENON_3,
            },
        ),
        CS20141: MapParameter(
            size=1,
            readwrite={
                "0": T5500K,
                "1": T6000K,
                "2": T6500K,
                "3": T7000K,
                "4": T7500K,
                "5": T8000K,
                "6": T8500K,
                "7": T9000K,
                "8": T9500K,
                "9": HIGH_BRIGHT,
                "D": XENON_1,
                "E": XENON_2,
                "F": XENON_3,
            },
        ),
        (CS20131, CS20121): MapParameter(
            size=1,
            readwrite={
                "0": T5500K,
                "1": T6000K,
                "2": T6500K,
                "3": T7000K,
                "4": T7500K,
                "5": T8000K,
                "6": T8500K,
                "7": T9000K,
                "8": T9500K,
                "9": HIGH_BRIGHT,
                "A": XENON_1,
                "B": XENON_2,
                "C": XENON_3,
            },
        ),
    }


class MotionEnhance(Command):
    """Motion Enhance command."""

    code = "PMME"
    reference = True
    operation = True

    OFF = "off"
    LOW = "low"
    HIGH = "high"

    parameter = {
        (CS20241, CS20221, CS20191, CS20172, CS20171, CS20161): MapParameter(
            size=1,
            readwrite={
                "0": OFF,
                "1": LOW,
                "2": HIGH,
            },
        ),
    }


class LightPower(Command):
    """Light Power (Lamp/Laser) command."""

    code = "PMLP"
    reference = True
    operation = True

    LOW = "low"
    MID = "mid"
    HIGH = "high"
    NORMAL = "normal"

    parameter = {
        (CS20241, CS20242): MapParameter(
            size=1,
            readwrite={
                "0": LOW,
                "1": HIGH,
                "2": MID,
            },
        ),
        CS20221: MapParameter(
            size=1,
            readwrite={"0": LOW, "1": HIGH, "2": (MID, B5A3, B5A2, B5A1)},
        ),
        CS20172: MapParameter(
            size=1,
            readwrite={
                "0": NORMAL,
                "1": HIGH,
                "2": MID,
            },
        ),
        (CS20191, CS20171, CS20161, CS20141, CS20131, CS20121): MapParameter(
            size=1,
            readwrite={
                "0": NORMAL,
                "1": HIGH,
            },
        ),
    }


class LaserPower(Command):
    """Laser Power (LD Current) command."""

    code = "PMCV"
    reference = True
    operation = True

    parameter = {
        (CS20241, CS20242): LaserPowerParameter(),
    }


class EShift(Command):
    """EShift command."""

    code = "PMUS"
    reference = True
    operation = True

    OFF = "off"
    ON = "on"

    parameter = {
        CS20241: MapParameter(
            size=1,
            readwrite={
                "0": OFF,
                "1": ON,
            },
        ),
        CS20221: MapParameter(
            size=1,
            readwrite={
                "0": (OFF, B5A1, B5A2, B5A3),
                "1": (ON, B5A1, B5A2, B5A3),
            },
        ),
        CS20191: MapParameter(
            size=1,
            readwrite={
                "0": (OFF, B2A1),
                "1": (ON, B2A1),
            },
        ),
        (CS20172, CS20171, CS20161, CS20141): MapParameter(
            size=1,
            readwrite={
                "0": OFF,
                "1": ON,
            },
        ),
    }


class GraphicMode(Command):
    """Graphic Mode command."""

    code = "PMGM"
    reference = True
    operation = True

    HIGH_RES = "high-res"
    HIGH_RES_2 = "high-res-2"
    OFF = "off"
    STANDARD = "standard"
    R2K = "2k"
    R4K = "4k"
    LOW = "low"
    HIGH = "high"

    parameter = {
        (CS20241, CS20221): MapParameter(
            size=1,
            read={
                "0": STANDARD,
                "1": HIGH_RES,
                "2": HIGH_RES_2,
                "F": OFF,
            },
            write={
                "0": STANDARD,
                "1": HIGH_RES,
                "2": HIGH_RES_2,
            },
        ),
        CS20242: MapParameter(
            size=1,
            readwrite={
                "0": HIGH,
                "1": LOW,
                "2": OFF,
            },
        ),
        CS20191: MapParameter(
            size=1,
            readwrite={
                "0": STANDARD,
                "1": HIGH_RES,
            },
        ),
        (CS20172, CS20171): MapParameter(
            size=1,
            readwrite={
                "0": R2K,
                "1": R4K,
            },
        ),
    }


class Smoother(Command):
    """Smoother command."""

    code = "PMST"
    reference = True
    operation = True

    OFF = "off"
    ON = "on"

    parameter = {
        CS20241: MapParameter(
            size=4,
            readwrite={
                "0000": ON,
                "0001": OFF,
            },
        )
    }


class Hdr(Command):
    """HDR command."""

    code = "IFHR"
    reference = True
    operation = False

    SDR = "sdr"
    HDR = "hdr"
    SMPTE_ST_2084 = "smpte-st-2084"
    HYBRID_LOG = "hybrid-log"
    HDR10_PLUS = "hdr10+"
    NONE = "none"

    parameter = {
        (CS20241, CS20242): MapParameter(
            size=1,
            read={
                "0": SDR,
                "1": HDR,
                "2": SMPTE_ST_2084,
                "3": HYBRID_LOG,
                "4": HDR10_PLUS,
                "F": NONE,
            },
        ),
        CS20221: MapParameter(
            size=1,
            read={
                "0": SDR,
                "1": HDR,
                "2": SMPTE_ST_2084,
                "3": HYBRID_LOG,
                "4": HDR10_PLUS,
                "F": NONE,
            },
        ),
        CS20191: MapParameter(
            size=1,
            read={
                "0": SDR,
                "1": HDR,
                "2": SMPTE_ST_2084,
                "3": HYBRID_LOG,
                "F": NONE,
            },
        ),
        CS20172: MapParameter(
            size=1,
            read={
                "0": SDR,
                "1": HDR,
                "2": SMPTE_ST_2084,
                "F": NONE,
            },
        ),
    }


class HdrLevel(Command):
    """HDR Level  (HDR Quantizer) adjustment command."""

    code = "PMHL"
    reference = True
    operation = True

    AUTO = "auto"
    AUTO_WIDE = "auto-wide"
    V_M2 = "-2"
    V_M1 = "-1"
    V_0 = "0"
    V_1 = "1"
    V_2 = "2"

    parameter = {
        (CS20241, CS20242, CS20221): MapParameter(
            size=1,
            readwrite={
                "0": AUTO,
                "1": V_M2,
                "2": V_M1,
                "3": V_0,
                "4": V_1,
                "5": V_2,
                "6": AUTO_WIDE,
            },
        ),
        CS20191: MapParameter(
            size=1,
            readwrite={
                "0": AUTO,
                "1": V_M2,
                "2": V_M1,
                "3": V_0,
                "4": V_1,
                "5": V_2,
            },
        ),
    }


class HdrProcessing(Command):
    """HDR Processing command."""

    code = "PMHP"
    reference = True
    operation = True
    depends = {Hdr: (Hdr.HDR, Hdr.HDR10_PLUS, Hdr.HYBRID_LOG, Hdr.SMPTE_ST_2084)}

    HDR10_PLUS = "hdr10+"
    STATIC = "static"
    FRAME_BY_FRAME = "frame-by-frame"
    SCENE_BY_SCENE = "scene-by-scene"

    parameter = {
        (CS20241, CS20242): MapParameter(
            size=1,
            read={
                "0": HDR10_PLUS,
                "1": STATIC,
                "2": FRAME_BY_FRAME,
                "3": SCENE_BY_SCENE,
            },
            write={
                "1": STATIC,
                "2": FRAME_BY_FRAME,
                "3": SCENE_BY_SCENE,
            },
        ),
        CS20221: MapParameter(
            size=1,
            readwrite={
                "0": HDR10_PLUS,
                "1": STATIC,
                "2": FRAME_BY_FRAME,
                "3": SCENE_BY_SCENE,
            },
        ),
        CS20191: MapParameter(
            size=1,
            readwrite={
                "1": STATIC,
                "2": FRAME_BY_FRAME,
                "3": SCENE_BY_SCENE,
            },
        ),
    }


class ContentType(Command):
    """Content Type command."""

    code = "PMCT"
    reference = True
    operation = True
    operation_timeout = 10.0

    AUTO = "auto"
    SDR = "sdr"
    HDR10_PLUS = "hdr10+"
    HDR10 = "hdr10"
    HLG = "hlg"

    parameter = {
        (CS20241, CS20242, CS20221): MapParameter(
            size=1,
            readwrite={
                "0": AUTO,
                "1": SDR,
                "2": HDR10_PLUS,
                "3": HDR10,
                "4": HLG,
            },
        ),
        CS20191: MapParameter(
            size=1,
            readwrite={
                "0": AUTO,
                "1": SDR,
                "3": HDR10,
                "4": HLG,
            },
        ),
    }


class TheaterOptimizer(Command):
    """Theater Optimizer command."""

    code = "PMNM"
    reference = True
    operation = True

    OFF = "off"
    ON = "on"

    parameter = {
        (CS20241, CS20221, CS20191): MapParameter(
            size=1,
            readwrite={
                "0": OFF,
                "1": ON,
            },
        ),
    }


class TheaterOptimizerLevel(Command):
    """Theater Optimizer Level command."""

    code = "PMNL"
    reference = True
    operation = True

    AUTO = "auto"
    AUTO_WIDE = "auto-wide"
    HIGH = "high"
    LOW = "low"
    MID = "mid"
    RESERVED = "reserved"
    V_M2 = "-2"
    V_M1 = "-1"
    V_0 = "0"
    V_1 = "1"
    V_2 = "2"

    parameter = {
        (CS20241, CS20221): MapParameter(
            size=1,
            readwrite={
                "0": AUTO,
                "1": V_M2,
                "2": V_M1,
                "3": V_0,
                "4": V_1,
                "5": V_2,
                "6": AUTO_WIDE,
            },
        ),
        CS20191: MapParameter(
            size=1,
            readwrite={
                "0": RESERVED,
                "1": LOW,
                "2": MID,
                "3": HIGH,
            },
        ),
    }


class TheaterOptimizerProcessing(Command):
    """Theater Optimizer Processing command."""

    code = "PMNP"
    reference = True
    operation = True

    OFF = "off"
    START = "start"

    parameter = {
        (CS20241, CS20221, CS20191): MapParameter(
            size=1,
            readwrite={
                "0": OFF,
                "1": START,
            },
        ),
    }


class DeepBlack(Command):
    """Deep Black command."""

    code = "PMBK"
    reference = True
    operation = True

    OFF = "off"
    ON = "on"

    parameter = {
        CS20241: MapParameter(
            size=1,
            readwrite={
                "0": OFF,
                "1": ON,
            },
        ),
    }


class HighlightColor(Command):
    """Highlight Color command."""

    code = "PMBE"
    reference = True
    operation = True

    LOW = "low"
    MID = "mid"
    HIGH = "high"

    parameter = {
        CS20241: MapParameter(
            size=1,
            readwrite={
                "0": LOW,
                "1": MID,
                "2": HIGH,
            },
        ),
    }


class HdmiInputLevel(Command):
    """HDMI Input Level command."""

    code = "ISIL"
    reference = True
    operation = True

    STANDARD = "standard"
    ENHANCED = "enhanced"
    SUPER_WHITE = "super-white"
    AUTO = "auto"

    parameter = MapParameter(
        size=1,
        readwrite={
            "0": STANDARD,
            "1": ENHANCED,
            "2": SUPER_WHITE,
            "3": AUTO,
        },
    )


class HdmiColorSpace(Command):
    """HDMI Color Space switch command."""

    code = "ISHS"
    reference = True
    operation = True

    AUTO = "auto"
    YCBCR_444 = "ycbcr-444"
    YCBCR_422 = "ycbcr-422"
    RGB = "rgb"

    parameter = MapParameter(
        size=1,
        readwrite={
            "0": AUTO,
            "1": YCBCR_444,
            "2": YCBCR_422,
            "3": RGB,
        },
    )


class Aspect(Command):
    """Aspect command."""

    code = "ISAS"
    reference = True
    operation = True

    A43 = "4:3"
    A169 = "16:9"
    ZOOM = "zoom"
    AUTO = "auto"
    JUST = "just"
    FULL = "full"
    NATIVE = "native"

    parameter = {
        (CS20241, CS20242, CS20221, CS20191): MapParameter(
            size=1,
            readwrite={
                "2": ZOOM,
                "3": AUTO,
                "4": NATIVE,
            },
        ),
        CS20172: MapParameter(
            size=1,
            readwrite={
                "2": ZOOM,
                "3": AUTO,
                "4": JUST,
            },
        ),
        CS20171: MapParameter(
            size=1,
            readwrite={
                "0": A43,
                "1": A169,
                "2": ZOOM,
            },
        ),
        (CS20161, CS20141, CS20131, CS20121): MapParameter(
            size=1,
            readwrite={
                "0": A43,
                "1": A169,
                "2": ZOOM,
                "3": AUTO,
                "4": JUST,
                "5": FULL,
            },
        ),
    }


class Hdmi2D3D(Command):
    """HDMI 2D/3D switch command."""

    code = "IS3D"
    reference = True
    operation = True

    TWO_D = "2d"
    AUTO = "auto"
    SIDE_BY_SIDE = "side-by-side"
    TOP_AND_BOTTOM = "top-and-bottom"

    parameter = MapParameter(
        size=1,
        readwrite={
            "0": TWO_D,
            "1": AUTO,
            "3": SIDE_BY_SIDE,
            "4": TOP_AND_BOTTOM,
        },
    )


class Mask(Command):
    """Mask command. TODO: Add numeric top, bottom, left, right values"""

    code = "ISMA"
    reference = True
    operation = True

    CUSTOM = "custom"
    CUSTOM_1 = "custom-1"
    CUSTOM_2 = "custom-2"
    CUSTOM_3 = "custom-3"
    OFF = "off"
    ON = "on"
    P2_5 = "2.5%"
    P5 = "5%"

    parameter = {
        (CS20241, CS20242, CS20221, CS20191, CS20172): MapParameter(
            size=1,
            readwrite={
                "1": ON,
                "2": OFF,
            },
        ),
        (CS20171, CS20161): MapParameter(
            size=1,
            readwrite={
                "0": CUSTOM_1,
                "1": CUSTOM_2,
                "2": OFF,
                "3": CUSTOM_3,
            },
        ),
        (CS20141, CS20131, CS20121): MapParameter(
            size=1,
            readwrite={
                "0": P2_5,
                "1": P5,
                "2": OFF,
                "3": CUSTOM,
            },
        ),
    }


class PictureModeHdr10(Command):
    """HDR10 Picture Mode command."""

    code = "ISHD"
    reference = True
    operation = True

    HDR10 = "hdr10"
    USER_4 = "user-4"
    USER_5 = "user-5"
    USER_6 = "user-6"
    FRAME_ADAPT_HDR = "frame-adapt-hdr"
    FRAME_ADAPT_HDR2 = "frame-adapt-hdr2"
    FRAME_ADAPT_HDR3 = "frame-adapt-hdr3"
    HDR10_LL = "hdr10-ll"
    PANA_PQ = "pana-pq"
    LAST_SETTING = "last-setting"
    HDR1 = "hdr1"
    HDR2 = "hdr2"

    parameter = {
        CS20241: MapParameter(
            size=1,
            readwrite={
                "1": HDR10,
                "5": USER_4,
                "6": USER_5,
                "7": USER_6,
                "8": FRAME_ADAPT_HDR,
                "C": FRAME_ADAPT_HDR2,
                "D": FRAME_ADAPT_HDR3,
                "E": HDR10_LL,
                "F": LAST_SETTING,
            },
        ),
        CS20242: MapParameter(
            size=1,
            readwrite={
                "4": HDR1,
                "5": HDR2,
                "8": FRAME_ADAPT_HDR,
                "C": FRAME_ADAPT_HDR2,
                "F": LAST_SETTING,
            },
        ),
        CS20221: MapParameter(
            size=1,
            readwrite={
                "1": HDR10,
                "5": USER_4,
                "6": USER_5,
                "7": USER_6,
                "8": FRAME_ADAPT_HDR,
                "9": PANA_PQ,
                "C": FRAME_ADAPT_HDR2,
                "D": FRAME_ADAPT_HDR3,
                "F": LAST_SETTING,
            },
        ),
        CS20191: MapParameter(
            size=1,
            readwrite={
                "1": HDR10,
                "5": USER_4,
                "6": USER_5,
                "7": USER_6,
                "8": FRAME_ADAPT_HDR,
                "9": PANA_PQ,
                "F": LAST_SETTING,
            },
        ),
    }


class PictureModeHlg(Command):
    """HLG Picture Mode command."""

    code = "ISHL"
    reference = True
    operation = True

    HLG = "hlg"
    HLG_LL = "hlg-ll"
    LAST_SETTING = "last-setting"
    USER_4 = "user-4"
    USER_5 = "user-5"
    USER_6 = "user-6"

    parameter = {
        CS20241: MapParameter(
            size=1,
            readwrite={
                "1": HLG,
                "5": USER_4,
                "6": USER_5,
                "7": USER_6,
                "9": HLG_LL,
                "F": LAST_SETTING,
            },
        ),
        (CS20221, CS20191): MapParameter(
            size=1,
            readwrite={
                "1": HLG,
                "5": USER_4,
                "6": USER_5,
                "7": USER_6,
                "F": LAST_SETTING,
            },
        ),
    }


class PictureModeSdr(Command):
    """SDR Picture Mode command."""

    code = "ISS2"
    reference = True
    operation = True

    NATURAL = "natural"
    USER_1 = "user-1"
    USER_2 = "user-2"
    USER_3 = "user-3"
    CINEMA = "cinema"
    FILM = "film"
    NATURAL_LL = "natural-ll"
    VIVID = "vivid"
    THX = "thx"
    LAST_SETTING = "last-setting"
    SDR_1 = "sdr-1"
    SDR_2 = "sdr-2"

    parameter = {
        CS20241: MapParameter(
            size=1,
            readwrite={
                "1": NATURAL,
                "2": USER_1,
                "3": USER_2,
                "4": USER_3,
                "8": CINEMA,
                "9": FILM,
                "D": NATURAL_LL,
                "E": VIVID,
                "F": LAST_SETTING,
            },
        ),
        CS20242: MapParameter(
            size=1,
            readwrite={
                "1": NATURAL,
                "2": SDR_1,
                "3": SDR_2,
                "8": CINEMA,
                "E": VIVID,
                "F": LAST_SETTING,
            },
        ),
        CS20221: MapParameter(
            size=1,
            readwrite={
                "1": NATURAL,
                "2": USER_1,
                "3": USER_2,
                "4": USER_3,
                "8": CINEMA,
                "9": (FILM, B5A1, B5A2),
                "F": LAST_SETTING,
            },
        ),
        CS20191: MapParameter(
            size=1,
            readwrite={
                "1": NATURAL,
                "2": USER_1,
                "3": USER_2,
                "4": USER_3,
                "8": CINEMA,
                "9": FILM,
                "E": THX,
                "F": LAST_SETTING,
            },
        ),
    }


class PictureModeSdr3d(Command):
    """SDR(3D) Picture Mode command."""

    code = "ISS3"
    reference = True
    operation = True

    NATURAL = "natural"
    USER_1 = "user-1"
    USER_2 = "user-2"
    USER_3 = "user-3"
    CINEMA = "cinema"
    FILM = "film"
    NATURAL_LL = "natural-ll"
    VIVID = "vivid"
    THX = "thx"
    LAST_SETTING = "last-setting"

    parameter = {
        CS20241: MapParameter(
            size=1,
            readwrite={
                "1": NATURAL,
                "2": USER_1,
                "3": USER_2,
                "4": USER_3,
                "8": CINEMA,
                "9": FILM,
                "D": NATURAL_LL,
                "E": VIVID,
                "F": LAST_SETTING,
            },
        ),
        CS20221: MapParameter(
            size=1,
            readwrite={
                "1": NATURAL,
                "2": USER_1,
                "3": USER_2,
                "4": USER_3,
                "8": CINEMA,
                "9": (FILM, B5A1, B5A2),
                "F": LAST_SETTING,
            },
        ),
        CS20191: MapParameter(
            size=1,
            readwrite={
                "1": NATURAL,
                "2": USER_1,
                "3": USER_2,
                "4": USER_3,
                "8": CINEMA,
                "9": FILM,
                "E": THX,
                "F": LAST_SETTING,
            },
        ),
    }


class FilmmakerMode(Command):
    """Filmmaker Mode command."""

    code = "ISFS"
    reference = True
    operation = True

    AUTO = "auto"
    MANUAL = "manual"

    parameter = {
        (CS20241, CS20242, CS20221): MapParameter(
            size=1,
            readwrite={
                "0": MANUAL,
                "1": AUTO,
            },
        ),
    }


class LowLatencyMode(Command):
    """Low Latency Mode command."""

    code = "PMLL"
    reference = True
    operation = True

    OFF = "off"
    ON = "on"

    parameter = {
        (CS20241, CS20221, CS20191, CS20172, CS20171): MapParameter(
            size=1,
            readwrite={
                "0": OFF,
                "1": ON,
            },
        ),
    }


class LowLatencyAutoMode(Command):
    """ALLM (Auto Low Latency Mode) command."""

    code = "ISAL"
    reference = True
    operation = True

    OFF = "off"
    ON = "on"

    parameter = {
        CS20241: MapParameter(
            size=1,
            readwrite={
                "0": OFF,
                "1": ON,
            },
        ),
    }


class DynamicControl(Command):
    """Dynamic Control command (Dynamic CTRL / CMS Display Color)."""

    code = "PMDC"
    reference = True
    operation = True
    depends = {LowLatencyMode: LowLatencyMode.OFF}

    BALANCED = "balanced"
    HIGH = "high"
    LOW = "low"
    MODE_1 = "mode-1"
    MODE_2 = "mode-2"
    MODE_3 = "mode-3"
    OFF = "off"

    parameter = {
        (CS20241, CS20242): MapParameter(
            size=1,
            readwrite={
                "0": OFF,
                "1": LOW,
                "2": HIGH,
                "3": BALANCED,
            },
        ),
        CS20221: MapParameter(
            size=1,
            readwrite={
                "0": (OFF, B5A1, B5A2, B5A3),
                "1": (MODE_1, B5A1, B5A2, B5A3),
                "2": (MODE_2, B5A1, B5A2, B5A3),
                "3": (MODE_3, B5A1, B5A2, B5A3),
            },
        ),
        CS20172: MapParameter(
            size=1,
            readwrite={
                "0": OFF,
                "1": MODE_1,
                "2": MODE_2,
            },
        ),
    }


class ClearMotionDrive(Command):
    """Clear Motion Drive command."""

    code = "PMCM"
    reference = True
    operation = True
    depends = {LowLatencyMode: LowLatencyMode.OFF}

    OFF = "off"
    LOW = "low"
    HIGH = "high"
    INVERSE_TELECINE = "inverse-telecine"

    parameter = {
        (
            CS20241,
            CS20221,
            CS20191,
            CS20172,
            CS20171,
            CS20161,
            CS20141,
            CS20131,
            CS20121,
        ): MapParameter(
            size=1,
            readwrite={
                "0": OFF,
                "3": LOW,
                "4": HIGH,
                "5": INVERSE_TELECINE,
            },
        ),
        CS20242: MapParameter(
            size=1,
            readwrite={
                "0": OFF,
                "6": HIGH,
                "7": LOW,
            },
        ),
    }


class InstallationMode(Command):
    """Installation Mode command."""

    code = "INML"
    reference = True
    operation = True
    operation_timeout = 30

    MEMORY_1 = "memory-1"
    MEMORY_2 = "memory-2"
    MEMORY_3 = "memory-3"
    MEMORY_4 = "memory-4"
    MEMORY_5 = "memory-5"
    MEMORY_6 = "memory-6"
    MEMORY_7 = "memory-7"
    MEMORY_8 = "memory-8"
    MEMORY_9 = "memory-9"
    MEMORY_10 = "memory-10"

    parameter = {
        (CS20241, CS20221, CS20191, CS20172): MapParameter(
            size=1,
            readwrite={
                "0": MEMORY_1,
                "1": MEMORY_2,
                "2": MEMORY_3,
                "3": MEMORY_4,
                "4": MEMORY_5,
                "5": MEMORY_6,
                "6": MEMORY_7,
                "7": MEMORY_8,
                "8": MEMORY_9,
                "9": MEMORY_10,
            },
        ),
        CS20242: MapParameter(
            size=1,
            readwrite={
                "0": MEMORY_1,
                "1": MEMORY_2,
                "2": MEMORY_3,
                "3": MEMORY_4,
                "4": MEMORY_5,
            },
        ),
        CS20171: MapParameter(
            size=1,
            readwrite={
                "0": MEMORY_1,
                "1": MEMORY_2,
                "2": MEMORY_3,
                "3": MEMORY_4,
                "4": MEMORY_5,
                "5": (MEMORY_6, XHR3),
                "6": (MEMORY_7, XHR3),
                "7": (MEMORY_8, XHR3),
                "8": (MEMORY_9, XHR3),
                "9": (MEMORY_10, XHR3),
            },
        ),
        CS20161: MapParameter(
            size=1,
            readwrite={
                "0": MEMORY_1,
                "1": MEMORY_2,
                "2": MEMORY_3,
                "3": MEMORY_4,
                "4": MEMORY_5,
                "5": (MEMORY_6, XHP3),
                "6": (MEMORY_7, XHP3),
                "7": (MEMORY_8, XHP3),
                "8": (MEMORY_9, XHP3),
                "9": (MEMORY_10, XHP3),
            },
        ),
        CS20141: MapParameter(
            size=1,
            readwrite={
                "0": MEMORY_1,
                "1": MEMORY_2,
                "2": MEMORY_3,
                "3": MEMORY_4,
                "4": MEMORY_5,
                "5": (MEMORY_6, XHK3),
                "6": (MEMORY_7, XHK3),
                "7": (MEMORY_8, XHK3),
                "8": (MEMORY_9, XHK3),
                "9": (MEMORY_10, XHK3),
            },
        ),
        (CS20131, CS20121): MapParameter(
            size=1,
            readwrite={
                "0": MEMORY_1,
                "1": MEMORY_2,
                "2": MEMORY_3,
            },
        ),
    }


class Trigger(Command):
    """Trigger command."""

    code = "FUTR"
    reference = True
    operation = True

    OFF = "off"
    POWER = "power"
    ANAMORPHIC = "anamorphic"
    INSTALLATION_1 = "installation-1"
    INSTALLATION_2 = "installation-2"
    INSTALLATION_3 = "installation-3"
    INSTALLATION_4 = "installation-4"
    INSTALLATION_5 = "installation-5"
    INSTALLATION_6 = "installation-6"
    INSTALLATION_7 = "installation-7"
    INSTALLATION_8 = "installation-8"
    INSTALLATION_9 = "installation-9"
    INSTALLATION_10 = "installation-10"

    parameter = {
        (CS20241, CS20221, CS20191, CS20172): MapParameter(
            size=1,
            readwrite={
                "0": OFF,
                "1": POWER,
                "2": ANAMORPHIC,
                "3": INSTALLATION_1,
                "4": INSTALLATION_2,
                "5": INSTALLATION_3,
                "6": INSTALLATION_4,
                "7": INSTALLATION_5,
                "8": INSTALLATION_6,
                "9": INSTALLATION_7,
                "A": INSTALLATION_8,
                "B": INSTALLATION_9,
                "C": INSTALLATION_10,
            },
        ),
        (CS20171, CS20161, CS20141, CS20131, CS20121): MapParameter(
            size=1,
            readwrite={
                "0": OFF,
                "1": POWER,
                "2": ANAMORPHIC,
            },
        ),
    }


class OffTimer(Command):
    """Off Timer switch command."""

    code = "FUOT"
    reference = True
    operation = True

    OFF = "off"
    HOUR_1 = "1-hour"
    HOUR_2 = "2-hours"
    HOUR_3 = "3-hours"
    HOUR_4 = "4-hours"

    parameter = MapParameter(
        size=1,
        readwrite={
            "0": OFF,
            "1": HOUR_1,
            "2": HOUR_2,
            "3": HOUR_3,
            "4": HOUR_4,
        },
    )


class EcoMode(Command):
    """Eco Mode command."""

    code = "FUEM"
    reference = True
    operation = True

    OFF = "off"
    ON = "on"

    parameter = MapParameter(
        size=1,
        readwrite={
            "0": OFF,
            "1": ON,
        },
    )


class HideEco(Command):
    """Hide Eco command."""

    code = "FUHE"
    reference = True
    operation = True

    OFF = "off"
    ON = "on"

    parameter = {
        (CS20241, CS20242, CS20172): MapParameter(
            size=1,
            readwrite={
                "0": OFF,
                "1": ON,
            },
        ),
        CS20221: MapParameter(
            size=1,
            readwrite={
                "0": (OFF, B5A1, B5A2, B5A3),
                "1": (ON, B5A1, B5A2, B5A3),
            },
        ),
    }


class Source(Command):
    """Signal (Source) command."""

    code = "IFIS"
    reference = True
    operation = False

    FWXGA_1366X768 = "fwxga-1366x768"
    NO_SIGNAL = "no-signal"
    OUT_OF_RANGE = "out-of-range"
    QXGA = "qxga"
    SVGA_800X600 = "svga-800x600"
    SXGA_1280X1024 = "sxga-1280x1024"
    UXGA_1600X1200 = "uxga-1600x1200"
    VGA_640X480 = "vga-640x480"
    R1080I_3D = "1080i-3d"
    R1080I_50 = "1080i-50"
    R1080I_60 = "1080i-60"
    R1080P_100 = "1080p-100"
    R1080P_120 = "1080p-120"
    R1080P_24 = "1080p-24"
    R1080P_25 = "1080p-25"
    R1080P_30 = "1080p-30"
    R1080P_3D = "1080p-3d"
    R1080P_50 = "1080p-50"
    R1080P_60 = "1080p-60"
    R2048X1080_P24 = "2048x1080-p24"
    R2048X1080_P25 = "2048x1080-p25"
    R2048X1080_P30 = "2048x1080-p30"
    R2048X1080_P50 = "2048x1080-p50"
    R2048X1080_P60 = "2048x1080-p60"
    R3840X1080_P50 = "3840x1080-p50"
    R3840X1080_P60 = "3840x1080-p60"
    R3840X2160_100HZ = "3840x2160-100hz"
    R3840X2160_P120 = "3840x2160-p120"
    R4096X2160_100HZ = "4096x2160-100hz"
    R4096X2160_P120 = "4096x2160-p120"
    R480I = "480i"
    R480P = "480p"
    R4K = "4k"
    R4K_3840_24 = "4k-3840-24"
    R4K_3840_25 = "4k-3840-25"
    R4K_3840_30 = "4k-3840-30"
    R4K_3840_50 = "4k-3840-50"
    R4K_3840_60 = "4k-3840-60"
    R4K_4096_24 = "4k-4096-24"
    R4K_4096_25 = "4k-4096-25"
    R4K_4096_30 = "4k-4096-30"
    R4K_4096_50 = "4k-4096-50"
    R4K_4096_60 = "4k-4096-60"
    R576I = "576i"
    R576P = "576p"
    R720P_3D = "720p-3d"
    R720P_50 = "720p-50"
    R720P_60 = "720p-60"
    R8K_7680X4320_24 = "8k-7680x4320-24"
    R8K_7680X4320_25 = "8k-7680x4320-25"
    R8K_7680X4320_30 = "8k-7680x4320-30"
    R8K_7680X4320_48 = "8k-7680x4320-48"
    R8K_7680X4320_50 = "8k-7680x4320-50"
    R8K_7680X4320_60 = "8k-7680x4320-60"
    WQHD_120 = "wqhd-120"
    WQHD_60 = "wqhd-60"
    WQXGA = "wqxga"
    WSXGA_PLUS_1680X1050 = "wsxga+1680x1050"
    WUXGA_1920X1200 = "wuxga-1920x1200"
    WXGA_1280X768 = "wxga-1280x768"
    WXGA_1280X800 = "wxga-1280x800"
    WXGA_PLUS_1440X900 = "wxga+1440x900"
    WXGA_PLUS_PLUS_1600X900 = "wxga++1600x900"
    XGA_1024X768 = "xga-1024x768"

    parameter = {
        (CS20241, CS20221): MapParameter(
            size=2,
            read={
                "02": R480P,
                "03": R576P,
                "04": R720P_50,
                "05": R720P_60,
                "06": R1080I_50,
                "07": R1080I_60,
                "08": R1080P_24,
                "09": R1080P_50,
                "0A": R1080P_60,
                "0B": NO_SIGNAL,
                "0C": R720P_3D,
                "0D": R1080I_3D,
                "0E": R1080P_3D,
                "0F": OUT_OF_RANGE,
                "10": R4K_4096_60,
                "11": R4K_4096_50,
                "12": R4K_4096_30,
                "13": R4K_4096_25,
                "14": R4K_4096_24,
                "15": R4K_3840_60,
                "16": R4K_3840_50,
                "17": R4K_3840_30,
                "18": R4K_3840_25,
                "19": R4K_3840_24,
                "1C": R1080P_25,
                "1D": R1080P_30,
                "1E": R2048X1080_P24,
                "1F": R2048X1080_P25,
                "20": R2048X1080_P30,
                "21": R2048X1080_P50,
                "22": R2048X1080_P60,
                "23": R3840X2160_P120,
                "24": R4096X2160_P120,
                "25": VGA_640X480,
                "26": SVGA_800X600,
                "27": XGA_1024X768,
                "28": SXGA_1280X1024,
                "29": WXGA_1280X768,
                "2A": WXGA_PLUS_1440X900,
                "2B": WSXGA_PLUS_1680X1050,
                "2C": WUXGA_1920X1200,
                "2D": WXGA_1280X800,
                "2E": FWXGA_1366X768,
                "2F": WXGA_PLUS_PLUS_1600X900,
                "30": UXGA_1600X1200,
                "31": QXGA,
                "32": WQXGA,
                "34": R4096X2160_100HZ,
                "35": R3840X2160_100HZ,
                "36": R1080P_100,
                "37": R1080P_120,
                "38": R8K_7680X4320_60,
                "39": R8K_7680X4320_50,
                "3A": R8K_7680X4320_30,
                "3B": R8K_7680X4320_25,
                "3C": R8K_7680X4320_24,
                "3D": WQHD_60,
                "3E": WQHD_120,
                "3F": R8K_7680X4320_48,
            },
        ),
        CS20242: MapParameter(
            size=2,
            read={
                "02": R480P,
                "03": R576P,
                "04": R720P_50,
                "05": R720P_60,
                "08": R1080P_24,
                "09": R1080P_50,
                "0A": R1080P_60,
                "0B": NO_SIGNAL,
                "0F": OUT_OF_RANGE,
                "10": R4K_4096_60,
                "11": R4K_4096_50,
                "12": R4K_4096_30,
                "13": R4K_4096_25,
                "14": R4K_4096_24,
                "15": R4K_3840_60,
                "16": R4K_3840_50,
                "17": R4K_3840_30,
                "18": R4K_3840_25,
                "19": R4K_3840_24,
                "1C": R1080P_25,
                "1D": R1080P_30,
                "1E": R2048X1080_P24,
                "1F": R2048X1080_P25,
                "20": R2048X1080_P30,
                "21": R2048X1080_P50,
                "22": R2048X1080_P60,
                "25": VGA_640X480,
                "26": SVGA_800X600,
                "2C": WUXGA_1920X1200,
                "30": UXGA_1600X1200,
                "31": QXGA,
                "3D": WQHD_60,
            },
        ),
        CS20191: MapParameter(
            size=2,
            read={
                "02": R480P,
                "03": R576P,
                "04": R720P_50,
                "05": R720P_60,
                "06": R1080I_50,
                "07": R1080I_60,
                "08": R1080P_24,
                "09": R1080P_50,
                "0A": R1080P_60,
                "0B": NO_SIGNAL,
                "0C": R720P_3D,
                "0D": R1080I_3D,
                "0E": R1080P_3D,
                "0F": OUT_OF_RANGE,
                "10": R4K_4096_60,
                "11": R4K_4096_50,
                "12": R4K_4096_30,
                "13": R4K_4096_25,
                "14": R4K_4096_24,
                "15": R4K_3840_60,
                "16": R4K_3840_50,
                "17": R4K_3840_30,
                "18": R4K_3840_25,
                "19": R4K_3840_24,
                "1C": R1080P_25,
                "1D": R1080P_30,
                "1E": R2048X1080_P24,
                "1F": R2048X1080_P25,
                "20": R2048X1080_P30,
                "21": R2048X1080_P50,
                "22": R2048X1080_P60,
                "23": R3840X2160_P120,
                "24": R4096X2160_P120,
                "25": VGA_640X480,
                "26": SVGA_800X600,
                "27": XGA_1024X768,
                "28": SXGA_1280X1024,
                "29": WXGA_1280X768,
                "2A": WXGA_PLUS_1440X900,
                "2B": WSXGA_PLUS_1680X1050,
                "2C": WUXGA_1920X1200,
                "2D": WXGA_1280X800,
                "2E": FWXGA_1366X768,
                "2F": WXGA_PLUS_PLUS_1600X900,
                "30": UXGA_1600X1200,
                "31": QXGA,
                "32": WQXGA,
            },
        ),
        CS20172: MapParameter(
            size=2,
            read={
                "02": R480P,
                "03": R576P,
                "04": R720P_50,
                "05": R720P_60,
                "06": R1080I_50,
                "07": R1080I_60,
                "08": R1080P_24,
                "09": R1080P_50,
                "0A": R1080P_60,
                "0B": NO_SIGNAL,
                "0C": R720P_3D,
                "0D": R1080I_3D,
                "0E": R1080P_3D,
                "0F": OUT_OF_RANGE,
                "10": R4K_4096_60,
                "11": R4K_4096_50,
                "12": R4K_4096_30,
                "13": R4K_4096_25,
                "14": R4K_4096_24,
                "15": R4K_3840_60,
                "16": R4K_3840_50,
                "17": R4K_3840_30,
                "18": R4K_3840_25,
                "19": R4K_3840_24,
                "1C": R1080P_25,
                "1D": R1080P_30,
                "1E": R2048X1080_P24,
                "1F": R2048X1080_P25,
                "20": R2048X1080_P30,
                "21": R2048X1080_P50,
                "22": R2048X1080_P60,
                "23": R3840X2160_P120,
                "24": R4096X2160_P120,
            },
        ),
        CS20171: MapParameter(
            size=2,
            read={
                "02": R480P,
                "03": R576P,
                "04": R720P_50,
                "05": R720P_60,
                "06": R1080I_50,
                "07": R1080I_60,
                "08": R1080P_24,
                "09": R1080P_50,
                "0A": R1080P_60,
                "0B": NO_SIGNAL,
                "0C": R720P_3D,
                "0D": R1080I_3D,
                "0E": R1080P_3D,
                "10": R4K_4096_60,
                "11": R4K_4096_50,
                "12": R4K_4096_30,
                "13": R4K_4096_25,
                "14": R4K_4096_24,
                "15": R4K_3840_60,
                "16": R4K_3840_50,
                "17": R4K_3840_30,
                "18": R4K_3840_25,
                "19": R4K_3840_24,
                "1A": R3840X1080_P50,
                "1B": R3840X1080_P60,
                "1C": R1080P_25,
                "1D": R1080P_30,
            },
        ),
        CS20161: MapParameter(
            size=2,
            read={
                "02": R480P,
                "03": R576P,
                "04": R720P_50,
                "05": R720P_60,
                "06": R1080I_50,
                "07": R1080I_60,
                "08": R1080P_24,
                "09": R1080P_50,
                "0A": R1080P_60,
                "0B": NO_SIGNAL,
                "0C": R720P_3D,
                "0D": R1080I_3D,
                "0E": R1080P_3D,
                "10": R4K_4096_60,
                "11": R4K_4096_50,
                "12": R4K_4096_30,
                "13": R4K_4096_25,
                "14": R4K_4096_24,
                "15": R4K_3840_60,
                "16": R4K_3840_50,
                "17": R4K_3840_30,
                "18": R4K_3840_25,
                "19": R4K_3840_24,
            },
        ),
        CS20141: MapParameter(
            size=1,
            read={
                "0": R480I,
                "1": R576I,
                "2": R480P,
                "3": R576P,
                "4": R720P_50,
                "5": R720P_60,
                "6": R1080I_50,
                "7": R1080I_60,
                "8": R1080P_24,
                "9": R1080P_50,
                "A": R1080P_60,
                "B": NO_SIGNAL,
                "C": R720P_3D,
                "D": R1080I_3D,
                "E": R1080P_3D,
                "F": R4K,
            },
        ),
        (CS20131, CS20121): MapParameter(
            size=1,
            read={
                "0": R480I,
                "1": R576I,
                "2": R480P,
                "3": R576P,
                "4": R720P_50,
                "5": R720P_60,
                "6": R1080I_50,
                "7": R1080I_60,
                "8": R1080P_24,
                "9": R1080P_50,
                "A": R1080P_60,
                "B": NO_SIGNAL,
                "C": R720P_3D,
                "D": R1080I_3D,
                "E": R1080P_3D,
            },
        ),
    }


class ColorDepth(Command):
    """Color Depth (Deep Color) command."""

    code = "IFDC"
    reference = True
    operation = False

    BIT_8 = "8-bit"
    BIT_10 = "10-bit"
    BIT_12 = "12-bit"

    parameter = MapParameter(
        size=1,
        read={
            "0": BIT_8,
            "1": BIT_10,
            "2": BIT_12,
        },
    )


class ColorSpace(Command):
    """Color Space Display command."""

    code = "IFXV"
    reference = True
    operation = False

    RGB = "rgb"
    YCBCR_422 = "ycbcr-422"
    YCBCR_444 = "ycbcr-444"
    YCBCR_420 = "ycbcr-420"
    YUV = "yuv"
    XV_COLOR = "xv-color"

    parameter = {
        (CS20241, CS20242, CS20221): MapParameter(
            size=1,
            read={
                "0": RGB,
                "1": YCBCR_422,
                "2": YCBCR_444,
                "3": YCBCR_420,
            },
        ),
        (CS20191, CS20172): MapParameter(
            size=1,
            read={
                "0": RGB,
                "1": YUV,
            },
        ),
        (CS20171, CS20161, CS20141): MapParameter(
            size=1,
            read={
                "0": RGB,
                "1": YUV,
                "2": XV_COLOR,
            },
        ),
    }


class Colorimetry(Command):
    """Colorimetry command."""

    code = "IFCM"
    reference = True
    operation = False

    NO_DATA = "no-data"
    BT_601 = "bt-601"
    BT_709 = "bt-709"
    XV_YCC_601 = "xvycc-601"
    XV_YCC_709 = "xvycc-709"
    S_YCC_601 = "sycc-601"
    ADOBE_YCC_601 = "adobe-ycc-601"
    ADOBE_RGB = "adobe-rgb"
    BT_2020_CONSTANT_LUMINANCE = "bt-2020-constant-luminance"
    BT_2020_NON_CONSTANT_LUMINANCE = "bt-2020-non-constant-luminance"
    S_RGB = "srgb"
    OTHER = "other"
    DCI_P3_D65 = "dci-p3-d65"
    DCI_P3_THEATER = "dci-p3-theater"

    parameter = {
        (CS20241, CS20242, CS20221): MapParameter(
            size=1,
            read={
                "0": NO_DATA,
                "1": BT_601,
                "2": BT_709,
                "3": XV_YCC_601,
                "4": XV_YCC_709,
                "5": S_YCC_601,
                "6": ADOBE_YCC_601,
                "7": ADOBE_RGB,
                "8": BT_2020_CONSTANT_LUMINANCE,
                "9": BT_2020_NON_CONSTANT_LUMINANCE,
                "A": S_RGB,
                "B": DCI_P3_D65,
                "C": DCI_P3_THEATER,
            },
        ),
        CS20191: MapParameter(
            size=1,
            read={
                "0": NO_DATA,
                "1": BT_601,
                "2": BT_709,
                "3": XV_YCC_601,
                "4": XV_YCC_709,
                "5": S_YCC_601,
                "6": ADOBE_YCC_601,
                "7": ADOBE_RGB,
                "8": BT_2020_CONSTANT_LUMINANCE,
                "9": BT_2020_NON_CONSTANT_LUMINANCE,
                "A": S_RGB,
            },
        ),
        CS20172: MapParameter(
            size=1,
            read={
                "0": NO_DATA,
                "1": BT_601,
                "2": BT_709,
                "3": XV_YCC_601,
                "4": XV_YCC_709,
                "5": S_YCC_601,
                "6": ADOBE_YCC_601,
                "7": ADOBE_RGB,
                "8": BT_2020_CONSTANT_LUMINANCE,
                "9": BT_2020_NON_CONSTANT_LUMINANCE,
                "A": OTHER,
            },
        ),
    }


class DscMode(Command):
    """Dsc Mode command."""

    code = "IFDS"
    reference = True
    operation = False

    OFF = "off"
    ON = "on"

    parameter = {
        (CS20241, CS20221): MapParameter(
            size=1,
            read={
                "0": OFF,
                "1": ON,
            },
        )
    }


class LinkRate(Command):
    """Link Rate command."""

    code = "IFLR"
    reference = True
    operation = False

    DISABLE = "disable"
    R_3_GBPS_3_LANES = "3-gbps-3-lanes"
    R_6_GBPS_3_LANES = "6-gbps-3-lanes"
    R_6_GBPS_4_LANES = "6-gbps-4-lanes"
    R_8_GBPS_4_LANES = "8-gbps-4-lanes"
    R_10_GBPS_4_LANES = "10-gbps-4-lanes"

    parameter = {
        (CS20241, CS20242, CS20221): MapParameter(
            size=1,
            read={
                "0": DISABLE,
                "1": R_3_GBPS_3_LANES,
                "3": R_6_GBPS_3_LANES,
                "4": R_6_GBPS_4_LANES,
                "5": R_8_GBPS_4_LANES,
                "6": R_10_GBPS_4_LANES,
            },
        ),
    }


class Anamorphic(Command):
    """Anamorphic command."""

    code = "INVS"
    reference = True
    operation = True

    OFF = "off"
    A = "a"
    B = "b"
    C = "c"
    D = "d"

    parameter = {
        (CS20241, CS20242, CS20221, CS20191): MapParameter(
            size=1,
            readwrite={
                "0": OFF,
                "1": A,
                "2": B,
                "3": C,
                "4": D,
            },
        ),
        (CS20172, CS20171, CS20161, CS20141, CS20131, CS20121): MapParameter(
            size=1,
            readwrite={
                "0": OFF,
                "1": A,
                "2": B,
            },
        ),
    }
