#include "lamp_program.h"

bool lp_resolve_duration(lg_mode mode, lp_recipe recipe, uint32_t *duration_ms) {
    static const uint32_t duration_table_ms[LP_RECIPE_COUNT] = {
        45000u, 120000u, 90000u, 120000u, 60000u, 120000u
    };
    if (!duration_ms || (mode != LG_AI && mode != LG_MANUAL) ||
        (unsigned)recipe >= (unsigned)LP_RECIPE_COUNT) return false;

    uint32_t duration = duration_table_ms[recipe];
    if ((recipe == LP_MANUAL_60 || recipe == LP_MANUAL_120) && mode != LG_MANUAL)
        return false;
    uint32_t mode_limit = mode == LG_AI ? LG_AI_MAX_RUN_MS : LG_MANUAL_MAX_RUN_MS;
    if (duration > mode_limit) return false;
    *duration_ms = duration;
    return true;
}

bool lp_resolve_one_touch_mode(lg_mode current_mode, lp_recipe recipe,
                               lg_mode *resolved_mode, uint32_t *duration_ms) {
    if (!resolved_mode || !duration_ms ||
        (current_mode != LG_OFF && current_mode != LG_AI &&
         current_mode != LG_MANUAL) ||
        (unsigned)recipe >= (unsigned)LP_RECIPE_COUNT ||
        recipe == LP_MANUAL_60 || recipe == LP_MANUAL_120) {
        return false;
    }

    lg_mode target_mode = current_mode == LG_OFF ? LG_AI : current_mode;
    if (recipe == LP_DARK_GEL || recipe == LP_TOP_COAT) {
        target_mode = LG_MANUAL;
    }

    uint32_t duration;
    if (!lp_resolve_duration(target_mode, recipe, &duration)) return false;
    *resolved_mode = target_mode;
    *duration_ms = duration;
    return true;
}

bool lp_arm_recipe(lg_guard *guard, lg_mode mode, lp_recipe recipe,
                   uint32_t now_ms) {
    uint32_t duration_ms;
    if (!guard || !lp_resolve_duration(mode, recipe, &duration_ms)) return false;
    return lg_arm(guard, mode, duration_ms, now_ms);
}

bool lp_arm_one_touch_recipe(lg_guard *guard, lg_mode current_mode,
                             lp_recipe recipe, uint32_t now_ms) {
    if (!guard) return false;
    lg_mode resolved_mode;
    uint32_t duration_ms;
    if (!lp_resolve_one_touch_mode(current_mode, recipe, &resolved_mode,
                                   &duration_ms)) {
        return false;
    }
    return lg_arm(guard, resolved_mode, duration_ms, now_ms);
}
