// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.content.browser.input;

import android.view.KeyEvent;
import android.view.MotionEvent;

import org.chromium.base.JNINamespace;

/**
 * Class to manage mapping information related to each supported gamepad controller device.
 */
@JNINamespace("content")
class GamepadMappings {
    private static final String NVIDIA_SHIELD_DEVICE_NAME_PREFIX =
            "NVIDIA Corporation NVIDIA Controller";
    private static final String MICROSOFT_XBOX_PAD_DEVICE_NAME = "Microsoft X-Box 360 pad";
    private static final String PS3_SIXAXIS_DEVICE_NAME = "Sony PLAYSTATION(R)3 Controller";
    private static final String SAMSUNG_EI_GP20_DEVICE_NAME = "Samsung Game Pad EI-GP20";

    public static boolean mapToStandardGamepad(float[] mappedAxes, float[] mappedButtons,
            float[] rawAxes, float[] rawButtons, String deviceName) {
        if (deviceName.startsWith(NVIDIA_SHIELD_DEVICE_NAME_PREFIX)) {
            mapShieldGamepad(mappedButtons, rawButtons, mappedAxes, rawAxes);
            return true;
        } else if (deviceName.equals(MICROSOFT_XBOX_PAD_DEVICE_NAME)) {
            mapXBox360Gamepad(mappedButtons, rawButtons, mappedAxes, rawAxes);
            return true;
        } else if (deviceName.equals(PS3_SIXAXIS_DEVICE_NAME)) {
            mapPS3SixAxisGamepad(mappedButtons, rawButtons, mappedAxes, rawAxes);
            return true;
        } else if (deviceName.equals(SAMSUNG_EI_GP20_DEVICE_NAME)) {
            mapSamsungEIGP20Gamepad(mappedButtons, rawButtons, mappedAxes, rawAxes);
            return true;
        }

        mapUnknownGamepad(mappedButtons, rawButtons, mappedAxes, rawAxes);
        return false;
    }

    private static void mapCommonXYABButtons(float[] mappedButtons, float[] rawButtons) {
        float a = rawButtons[KeyEvent.KEYCODE_BUTTON_A];
        float b = rawButtons[KeyEvent.KEYCODE_BUTTON_B];
        float x = rawButtons[KeyEvent.KEYCODE_BUTTON_X];
        float y = rawButtons[KeyEvent.KEYCODE_BUTTON_Y];
        mappedButtons[CanonicalButtonIndex.PRIMARY] = a;
        mappedButtons[CanonicalButtonIndex.SECONDARY] = b;
        mappedButtons[CanonicalButtonIndex.TERTIARY] = x;
        mappedButtons[CanonicalButtonIndex.QUATERNARY] = y;
    }

    private static void mapCommonStartSelectMetaButtons(
            float[] mappedButtons, float[] rawButtons) {
        float start = rawButtons[KeyEvent.KEYCODE_BUTTON_START];
        float select = rawButtons[KeyEvent.KEYCODE_BUTTON_SELECT];
        float mode = rawButtons[KeyEvent.KEYCODE_BUTTON_MODE];
        mappedButtons[CanonicalButtonIndex.START] = start;
        mappedButtons[CanonicalButtonIndex.BACK_SELECT] = select;
        mappedButtons[CanonicalButtonIndex.META] = mode;
    }

    private static void mapCommonThumbstickButtons(float[] mappedButtons, float[] rawButtons) {
        float thumbL = rawButtons[KeyEvent.KEYCODE_BUTTON_THUMBL];
        float thumbR = rawButtons[KeyEvent.KEYCODE_BUTTON_THUMBR];
        mappedButtons[CanonicalButtonIndex.LEFT_THUMBSTICK] = thumbL;
        mappedButtons[CanonicalButtonIndex.RIGHT_THUMBSTICK] = thumbR;
    }

    private static void mapCommonTriggerButtons(float[] mappedButtons, float[] rawButtons) {
        float l1 = rawButtons[KeyEvent.KEYCODE_BUTTON_L1];
        float r1 = rawButtons[KeyEvent.KEYCODE_BUTTON_R1];
        mappedButtons[CanonicalButtonIndex.LEFT_TRIGGER] = l1;
        mappedButtons[CanonicalButtonIndex.RIGHT_TRIGGER] = r1;
    }

    private static void mapCommonDpadButtons(float[] mappedButtons, float[] rawButtons) {
        float dpadDown = rawButtons[KeyEvent.KEYCODE_DPAD_DOWN];
        float dpadUp = rawButtons[KeyEvent.KEYCODE_DPAD_UP];
        float dpadLeft = rawButtons[KeyEvent.KEYCODE_DPAD_LEFT];
        float dpadRight = rawButtons[KeyEvent.KEYCODE_DPAD_RIGHT];
        mappedButtons[CanonicalButtonIndex.DPAD_DOWN] = dpadDown;
        mappedButtons[CanonicalButtonIndex.DPAD_UP] = dpadUp;
        mappedButtons[CanonicalButtonIndex.DPAD_LEFT] = dpadLeft;
        mappedButtons[CanonicalButtonIndex.DPAD_RIGHT] = dpadRight;
    }

    private static void mapXYAxes(float[] mappedAxes, float[] rawAxes) {
        mappedAxes[CanonicalAxisIndex.LEFT_STICK_X] = rawAxes[MotionEvent.AXIS_X];
        mappedAxes[CanonicalAxisIndex.LEFT_STICK_Y] = rawAxes[MotionEvent.AXIS_Y];
    }

    private static void mapRXAndRYAxesToRightStick(float[] mappedAxes, float[] rawAxes) {
        mappedAxes[CanonicalAxisIndex.RIGHT_STICK_X] = rawAxes[MotionEvent.AXIS_RX];
        mappedAxes[CanonicalAxisIndex.RIGHT_STICK_Y] = rawAxes[MotionEvent.AXIS_RY];
    }

    private static void mapZAndRZAxesToRightStick(float[] mappedAxes, float[] rawAxes) {
        mappedAxes[CanonicalAxisIndex.RIGHT_STICK_X] = rawAxes[MotionEvent.AXIS_Z];
        mappedAxes[CanonicalAxisIndex.RIGHT_STICK_Y] = rawAxes[MotionEvent.AXIS_RZ];
    }

    private static void mapTriggerAxexToShoulderButtons(float[] mappedButtons, float[] rawAxes) {
        float lTrigger = rawAxes[MotionEvent.AXIS_LTRIGGER];
        float rTrigger = rawAxes[MotionEvent.AXIS_RTRIGGER];
        mappedButtons[CanonicalButtonIndex.LEFT_SHOULDER] = lTrigger;
        mappedButtons[CanonicalButtonIndex.RIGHT_SHOULDER] = rTrigger;
    }

    private static float negativeAxisValueAsButton(float input) {
        return (input < -0.5f) ? 1.f : 0.f;
    }

    private static float positiveAxisValueAsButton(float input) {
        return (input > 0.5f) ? 1.f : 0.f;
    }

    private static void mapHatAxisToDpadButtons(float[] mappedButtons, float[] rawAxes) {
        float hatX = rawAxes[MotionEvent.AXIS_HAT_X];
        float hatY = rawAxes[MotionEvent.AXIS_HAT_Y];
        mappedButtons[CanonicalButtonIndex.DPAD_LEFT] = negativeAxisValueAsButton(hatX);
        mappedButtons[CanonicalButtonIndex.DPAD_RIGHT] = positiveAxisValueAsButton(hatX);
        mappedButtons[CanonicalButtonIndex.DPAD_UP] = negativeAxisValueAsButton(hatY);
        mappedButtons[CanonicalButtonIndex.DPAD_DOWN] = positiveAxisValueAsButton(hatY);
    }

    /**
     * Method for mapping Nvidia gamepad axis and button values
     * to standard gamepad button and axes values.
     */
    private static void mapShieldGamepad(float[] mappedButtons, float[] rawButtons,
            float[] mappedAxes, float[] rawAxes) {
        mapCommonXYABButtons(mappedButtons, rawButtons);
        mapCommonTriggerButtons(mappedButtons, rawButtons);
        mapCommonThumbstickButtons(mappedButtons, rawButtons);
        mapCommonStartSelectMetaButtons(mappedButtons, rawButtons);
        mapTriggerAxexToShoulderButtons(mappedButtons, rawAxes);
        mapHatAxisToDpadButtons(mappedButtons, rawAxes);

        mapXYAxes(mappedAxes, rawAxes);
        mapZAndRZAxesToRightStick(mappedAxes, rawAxes);
    }

    /**
     * Method for mapping Microsoft XBox 360 gamepad axis and button values
     * to standard gamepad button and axes values.
     */
    private static void mapXBox360Gamepad(float[] mappedButtons, float[] rawButtons,
            float[] mappedAxes, float[] rawAxes) {
        // These are actually mapped the same way in Android.
        mapShieldGamepad(mappedButtons, rawButtons, mappedAxes, rawAxes);
    }

    private static void mapPS3SixAxisGamepad(float[] mappedButtons, float[] rawButtons,
            float[] mappedAxes, float[] rawAxes) {
        // On PS3 X/Y has higher priority.
        float a = rawButtons[KeyEvent.KEYCODE_BUTTON_A];
        float b = rawButtons[KeyEvent.KEYCODE_BUTTON_B];
        float x = rawButtons[KeyEvent.KEYCODE_BUTTON_X];
        float y = rawButtons[KeyEvent.KEYCODE_BUTTON_Y];
        mappedButtons[CanonicalButtonIndex.PRIMARY] = x;
        mappedButtons[CanonicalButtonIndex.SECONDARY] = y;
        mappedButtons[CanonicalButtonIndex.TERTIARY] = a;
        mappedButtons[CanonicalButtonIndex.QUATERNARY] = b;

        mapCommonTriggerButtons(mappedButtons, rawButtons);
        mapCommonThumbstickButtons(mappedButtons, rawButtons);
        mapCommonDpadButtons(mappedButtons, rawButtons);
        mapCommonStartSelectMetaButtons(mappedButtons, rawButtons);
        mapTriggerAxexToShoulderButtons(mappedButtons, rawAxes);

        mapXYAxes(mappedAxes, rawAxes);
        mapZAndRZAxesToRightStick(mappedAxes, rawAxes);
    }

    private static void mapSamsungEIGP20Gamepad(float[] mappedButtons, float[] rawButtons,
            float[] mappedAxes, float[] rawAxes) {
        mapCommonXYABButtons(mappedButtons, rawButtons);
        mapCommonTriggerButtons(mappedButtons, rawButtons);
        mapCommonThumbstickButtons(mappedButtons, rawButtons);
        mapCommonStartSelectMetaButtons(mappedButtons, rawButtons);
        mapHatAxisToDpadButtons(mappedButtons, rawAxes);

        mapXYAxes(mappedAxes, rawAxes);
        mapRXAndRYAxesToRightStick(mappedAxes, rawAxes);
    }

    /**
     * Method for mapping Unkown gamepad axis and button values
     * to standard gamepad button and axes values.
     */
    private static void mapUnknownGamepad(float[] mappedButtons, float[] rawButtons,
            float[] mappedAxes, float[] rawAxes) {
        mapCommonXYABButtons(mappedButtons, rawButtons);
        mapCommonTriggerButtons(mappedButtons, rawButtons);
        mapCommonThumbstickButtons(mappedButtons, rawButtons);
        mapCommonStartSelectMetaButtons(mappedButtons, rawButtons);
        mapTriggerAxexToShoulderButtons(mappedButtons, rawAxes);
        mapCommonDpadButtons(mappedButtons, rawButtons);

        mapXYAxes(mappedAxes, rawAxes);
        mapRXAndRYAxesToRightStick(mappedAxes, rawAxes);
    }
}
