/*---------------------------------------------------------*\
| RGBController_AsusAuraMonitor.cpp                         |
|                                                           |
|   RGBController for ASUS Aura monitor                     |
|                                                           |
|   Mola19                                      08 Mar 2022 |
|                                                           |
|   This file is part of the OpenRGB project                |
|   SPDX-License-Identifier: GPL-2.0-or-later               |
\*---------------------------------------------------------*/

#include "RGBController_AsusAuraMonitor.h"

/**------------------------------------------------------------------*\
    @name Asus Aura Monitor
    @category Accessory
    @type USB
    @save :x:
    @direct :white_check_mark:
    @effects :x:
    @detectors DetectAsusAuraUSBMonitor
    @comment
\*-------------------------------------------------------------------*/

RGBController_AuraMonitor::RGBController_AuraMonitor(AuraMonitorController* controller_ptr)
{
    controller          = controller_ptr;

    name                = controller->GetNameString();
    vendor              = "ASUS";
    type                = DEVICE_TYPE_MONITOR;
    description         = "ASUS Aura Monitor Device";
    location            = controller->GetDeviceLocation();
    serial              = controller->GetSerialString();

    mode Direct;
    Direct.name         = "Direct";
    Direct.value        = 0;
    Direct.flags        = MODE_FLAG_HAS_PER_LED_COLOR;
    Direct.color_mode   = MODE_COLORS_PER_LED;
    modes.push_back(Direct);

    SetupZones();
}

RGBController_AuraMonitor::~RGBController_AuraMonitor()
{
    delete controller;
}

void RGBController_AuraMonitor::SetupZones()
{
    zone underglow_zone;

    underglow_zone.name         = "Backlight";
    underglow_zone.type         = ZONE_TYPE_LINEAR;
    underglow_zone.leds_min     = 3;
    underglow_zone.leds_max     = 3;
    underglow_zone.leds_count   = 3;
    underglow_zone.matrix_map   = NULL;

    zones.push_back(underglow_zone);

    for(unsigned int i = 0; i < 3; i++)
    {
        led underglow_led;

        underglow_led.name      = "Backlight LED " + std::to_string(i + 1);

        leds.push_back(underglow_led);
    }

    SetupColors();
}

void RGBController_AuraMonitor::ResizeZone(int /*zone*/, int /*new_size*/)
{
    /*---------------------------------------------------------*\
    | This device does not support resizing zones               |
    \*---------------------------------------------------------*/
}

void RGBController_AuraMonitor::DeviceUpdateLEDs()
{
    controller->BeginUpdate();

    for (int i = 0; i < 3; i++)
    {
        unsigned char red   = RGBGetRValue(colors[i]);
        unsigned char green = RGBGetGValue(colors[i]);
        unsigned char blue  = RGBGetBValue(colors[i]);

        controller->UpdateLed(i, red, green, blue);
    }

    controller->ApplyChanges();
}

void RGBController_AuraMonitor::UpdateZoneLEDs(int /*zone*/)
{
    DeviceUpdateLEDs();
}

void RGBController_AuraMonitor::UpdateSingleLED(int led)
{
    controller->BeginUpdate();

    unsigned char red   = RGBGetRValue(colors[led]);
    unsigned char green = RGBGetGValue(colors[led]);
    unsigned char blue  = RGBGetBValue(colors[led]);

    controller->UpdateLed(led, red, green, blue);

    controller->ApplyChanges();
}

void RGBController_AuraMonitor::DeviceUpdateMode()
{
    /*---------------------------------------------------------*\
    | This device does not support Mode changing                |
    \*---------------------------------------------------------*/
}

void RGBController_AuraMonitor::DeviceSaveMode()
{
    /*---------------------------------------------------------*\
    | This device does not support Mode saving                  |
    \*---------------------------------------------------------*/
}
