import { AnyAction } from 'redux';
import { ThunkAction } from 'redux-thunk';
import { daemon } from '../websocket';
import { lookupOverclockLevel } from '../util/overclock';
import { Command, CommandMessage } from '../models/index';

import {
    // OverclockState,
    OverclockLevel,
    MonitoringMetric,
    ButtonMapping
} from '../models'

import {
    ENABLE_OVERCLOCKING,
    EnableOverclockingAction,
    SET_OVERCLOCK_LEVEL,
    // SetOverclockLevelAction,
    SET_REBOOT_FLAG,
    SetRebootFlagAction,
    SET_MONITORING_METRIC,
    SetMonitoringMetricAction,
    ADD_BUTTON_MAPPING,
    AddButtonMappingAction,
    REMOVE_BUTTON_MAPPING,
    RemoveButtonMappingAction,
    TOGGLE_BUTTON_MAPPING,
    ToggleButtonMappingAction
} from '../types/actions';

// Overclocking actions

export function enableOverclocking(): EnableOverclockingAction {
    return { type: ENABLE_OVERCLOCKING };
}

export function setOverclockLevel(level: OverclockLevel):
    ThunkAction<void, any, unknown, AnyAction> {
    return (dispatch) => {
        const msg: CommandMessage = {
            command: Command.Overclock,
            params: lookupOverclockLevel(level)
        };

        daemon.next(msg);
        dispatch({ type: SET_OVERCLOCK_LEVEL, level });
    }
}

export function setRebootFlag(): SetRebootFlagAction {
    return { type: SET_REBOOT_FLAG };
}

// Monitoring actions

export function setMonitoringMetric(metric: string, metricState: boolean): SetMonitoringMetricAction {
    return {
        type: SET_MONITORING_METRIC,
        metric: metric as MonitoringMetric,
        metricState
    };
}

// Button mapping actions
export function addButtonMapping(mapping: ButtonMapping): AddButtonMappingAction {
    return { type: ADD_BUTTON_MAPPING, mapping: mapping };
}

export function removeButtonMapping(id: string): RemoveButtonMappingAction {
    return { type: REMOVE_BUTTON_MAPPING, id: id };
}

export function toggleButtonMapping(id: string, active: boolean): ToggleButtonMappingAction {
    return { type: TOGGLE_BUTTON_MAPPING, id: id, active: active };
}