/*---------------------------------------------------------*\
| NZXTHue2ControllerDetect.cpp                              |
|                                                           |
|   Detector for NZXT Hue 2                                 |
|                                                           |
|   Adam Honse (calcprogrammer1@gmail.com)      29 Dec 2019 |
|                                                           |
|   This file is part of the OpenRGB project                |
|   SPDX-License-Identifier: GPL-2.0-or-later               |
\*---------------------------------------------------------*/

#include <hidapi.h>
#include "Detector.h"
#include "LogManager.h"
#include "NZXTHue2Controller.h"
#include "RGBController_NZXTHue2.h"

#define NZXT_VID                                0x1E71
#define NZXT_HUE_2_PID                          0x2001
#define NZXT_HUE_2_AMBIENT_PID                  0x2002
#define NZXT_MOTHERBOARD_DEVICE_PID             0x2005
#define NZXT_MOTHERBOARD_DEVICE_2_PID           0x200B
#define NZXT_SMART_DEVICE_V2_PID                0x2006
#define NZXT_KRAKEN_X3_SERIES_PID               0x2007
#define NZXT_KRAKEN_X3_SERIES_RGB_PID           0x2014
#define NZXT_KRAKEN_2024_ELITE_SERIES_RGB_PID   0x3012
#define NZXT_RGB_FAN_CONTROLLER_PID             0x2009
#define NZXT_RGB_FAN_CONTROLLER2_PID            0x2010
#define NZXT_RGB_FAN_CONTROLLER3_PID            0x200E
#define NZXT_RGB_FAN_CONTROLLER4_PID            0x2011
#define NZXT_RGB_FAN_CONTROLLER5_PID            0x2019
#define NZXT_RGB_FAN_CONTROLLER6_PID            0x2020
#define NZXT_RGB_FAN_CONTROLLER7_PID            0x201F
#define NZXT_RGB_FAN_CONTROLLER8_PID            0x2022
#define NZXT_RGB_FAN_CONTROLLER9_PID            0x201B
#define NZXT_RGB_CONTROLLER_1_PID               0x2012
#define NZXT_RGB_CONTROLLER_2_PID               0x2021
#define NZXT_SMART_DEVICE_V2_1_PID              0x200D
#define NZXT_SMART_DEVICE_V2_2_PID              0x200F

static void spawn_hue(hid_device_info* info, const std::string& name, int rgb_channels, int fan_channels, bool use_2023_effects = false)
{
    hid_device* dev = hid_open_path(info->path);

    if(dev)
    {
        NZXTHue2Controller*     controller     = new NZXTHue2Controller(dev, rgb_channels, fan_channels, info->path, name, use_2023_effects);
        RGBController_NZXTHue2* rgb_controller = new RGBController_NZXTHue2(controller);

        ResourceManager::get()->RegisterRGBController(rgb_controller);
        LOG_TRACE("[NZXTHue2Controller] NZXT Controller setup: %s", info->path);
    }
    else
    {
        LOG_DEBUG("[NZXTHue2Controller] Failed to load device: %s!", info->path);
    }
}

void DetectNZXTHue2(hid_device_info* info, const std::string& name)
{
    spawn_hue(info, name, 4, 0);
}

void DetectNZXTHue2Ambient(hid_device_info* info, const std::string& name)
{
    spawn_hue(info, name, 2, 0);
}

void DetectNZXTHue2Motherboard(hid_device_info* info, const std::string& name)
{
    spawn_hue(info, name, 2, 3);
}

void DetectNZXTSmartDeviceV2(hid_device_info* info, const std::string& name)
{
    spawn_hue(info, name, 2, 3);
}

void DetectNZXTKrakenX3(hid_device_info* info, const std::string& name)
{
    spawn_hue(info, name, 3, 0);
}

void DetectNZXTKrakenElite(hid_device_info* info, const std::string& name)
{
    spawn_hue(info, name, 2, 2, true);
}

void DetectNZXTFanController(hid_device_info* info, const std::string& name)
{
    spawn_hue(info, name, 2, 3);
}

void DetectNZXTFanController6Channel(hid_device_info* info, const std::string& name)
{
    spawn_hue(info, name, 6, 3);
}

void DetectNZXTRGBController(hid_device_info* info, const std::string& name)
{
    spawn_hue(info, name, 3, 0);
}

REGISTER_HID_DETECTOR("NZXT RGB & Fan Controller",          DetectNZXTFanController,         NZXT_VID, NZXT_RGB_FAN_CONTROLLER_PID);
REGISTER_HID_DETECTOR("NZXT RGB & Fan Controller",          DetectNZXTFanController,         NZXT_VID, NZXT_RGB_FAN_CONTROLLER2_PID);
REGISTER_HID_DETECTOR("NZXT RGB & Fan Controller",          DetectNZXTFanController,         NZXT_VID, NZXT_RGB_FAN_CONTROLLER3_PID);
REGISTER_HID_DETECTOR("NZXT RGB & Fan Controller",          DetectNZXTFanController6Channel, NZXT_VID, NZXT_RGB_FAN_CONTROLLER4_PID);
REGISTER_HID_DETECTOR("NZXT RGB & Fan Controller",          DetectNZXTFanController6Channel, NZXT_VID, NZXT_RGB_FAN_CONTROLLER5_PID);
REGISTER_HID_DETECTOR("NZXT RGB & Fan Controller",          DetectNZXTFanController6Channel, NZXT_VID, NZXT_RGB_FAN_CONTROLLER6_PID);
REGISTER_HID_DETECTOR("NZXT RGB & Fan Controller",          DetectNZXTFanController6Channel, NZXT_VID, NZXT_RGB_FAN_CONTROLLER7_PID);
REGISTER_HID_DETECTOR("NZXT RGB & Fan Controller 2024",     DetectNZXTFanController6Channel, NZXT_VID, NZXT_RGB_FAN_CONTROLLER8_PID);
REGISTER_HID_DETECTOR("NZXT B650E Motherboard",             DetectNZXTFanController6Channel, NZXT_VID, NZXT_RGB_FAN_CONTROLLER9_PID);
REGISTER_HID_DETECTOR("NZXT Hue 2",                         DetectNZXTHue2,                  NZXT_VID, NZXT_HUE_2_PID);
REGISTER_HID_DETECTOR("NZXT Hue 2 Ambient",                 DetectNZXTHue2Ambient,           NZXT_VID, NZXT_HUE_2_AMBIENT_PID);
REGISTER_HID_DETECTOR("NZXT Hue 2 Motherboard",             DetectNZXTHue2Motherboard,       NZXT_VID, NZXT_MOTHERBOARD_DEVICE_PID);
REGISTER_HID_DETECTOR("NZXT Hue 2 Motherboard",             DetectNZXTHue2Motherboard,       NZXT_VID, NZXT_MOTHERBOARD_DEVICE_2_PID);
REGISTER_HID_DETECTOR("NZXT Kraken X3 Series",              DetectNZXTKrakenX3,              NZXT_VID, NZXT_KRAKEN_X3_SERIES_PID);
REGISTER_HID_DETECTOR("NZXT Kraken X3 Series RGB",          DetectNZXTKrakenX3,              NZXT_VID, NZXT_KRAKEN_X3_SERIES_RGB_PID);
REGISTER_HID_DETECTOR("NZXT Kraken 2024 ELITE Series RGB",  DetectNZXTKrakenElite,           NZXT_VID, NZXT_KRAKEN_2024_ELITE_SERIES_RGB_PID);
REGISTER_HID_DETECTOR("NZXT RGB Controller",                DetectNZXTRGBController,         NZXT_VID, NZXT_RGB_CONTROLLER_1_PID);
REGISTER_HID_DETECTOR("NZXT RGB Controller",                DetectNZXTRGBController,         NZXT_VID, NZXT_RGB_CONTROLLER_2_PID);
REGISTER_HID_DETECTOR("NZXT Smart Device V2",               DetectNZXTSmartDeviceV2,         NZXT_VID, NZXT_SMART_DEVICE_V2_PID);
REGISTER_HID_DETECTOR("NZXT Smart Device V2",               DetectNZXTSmartDeviceV2,         NZXT_VID, NZXT_SMART_DEVICE_V2_1_PID);
REGISTER_HID_DETECTOR("NZXT Smart Device V2",               DetectNZXTSmartDeviceV2,         NZXT_VID, NZXT_SMART_DEVICE_V2_2_PID);
