#include "lamp_ui_policy.h"

static bool button_recipe(lamp_ui_button button, lp_recipe *recipe) {
    if (!recipe) return false;
    switch (button) {
        case LUI_BUTTON_BASE_COLOR: *recipe = LP_BASE_COLOR; return true;
        case LUI_BUTTON_DARK_GEL: *recipe = LP_DARK_GEL; return true;
        case LUI_BUTTON_BUILDER_EXTENSION: *recipe = LP_BUILDER_EXTENSION; return true;
        case LUI_BUTTON_TOP_COAT: *recipe = LP_TOP_COAT; return true;
        default: return false;
    }
}

bool lamp_ui_resolve_button(lg_mode current_mode, lamp_ui_button button,
                            lamp_ui_command *command) {
    if (!command) return false;

    lamp_ui_command next = {
        .kind = LUI_COMMAND_NONE,
        .mode = current_mode,
        .recipe = LP_RECIPE_COUNT,
        .duration_ms = 0u
    };

    if (button == LUI_BUTTON_CANCEL) {
        next.kind = LUI_COMMAND_STOP;
        *command = next;
        return true;
    }
    if (current_mode == LG_FAULT) return false;

    if (button == LUI_BUTTON_LONG_PRESS_MANUAL) {
        if (current_mode != LG_OFF && current_mode != LG_AI &&
            current_mode != LG_MANUAL) return false;
        next.kind = LUI_COMMAND_SET_MODE;
        next.mode = LG_MANUAL;
        *command = next;
        return true;
    }

    lp_recipe recipe;
    if (button_recipe(button, &recipe)) {
        lg_mode resolved_mode;
        if (!lp_resolve_one_touch_mode(current_mode, recipe, &resolved_mode,
                                       &next.duration_ms)) return false;
        next.kind = LUI_COMMAND_START_RECIPE;
        next.mode = resolved_mode;
        next.recipe = recipe;
        *command = next;
        return true;
    }

    if (current_mode != LG_MANUAL) return false;
    if (button == LUI_BUTTON_MANUAL_60) recipe = LP_MANUAL_60;
    else if (button == LUI_BUTTON_MANUAL_120) recipe = LP_MANUAL_120;
    else return false;

    if (!lp_resolve_duration(LG_MANUAL, recipe, &next.duration_ms)) return false;
    next.kind = LUI_COMMAND_START_RECIPE;
    next.mode = LG_MANUAL;
    next.recipe = recipe;
    *command = next;
    return true;
}
