import os
import time

if os.name == 'nt':
    import vgamepad as vg


class PS4_Buttons:
    def __init__(self):
        self.gamepad = vg.VDS4Gamepad()
        self.gamepad.update()
        time.sleep(0.1)

    def press_l2_r2(self, button):
        self.gamepad.press_button(button)  # value between 0 and 255
        if button == vg.DS4_BUTTONS.DS4_BUTTON_TRIGGER_RIGHT:
            self.gamepad.right_trigger(value=255)
        else:
            self.gamepad.left_trigger(value=255)
        self.gamepad.update()
        time.sleep(.2)

    def release_l2_r2(self, button):
        self.gamepad.release_button(button)  # value between 0 and 255
        if button == vg.DS4_BUTTONS.DS4_BUTTON_TRIGGER_RIGHT:
            self.gamepad.right_trigger(value=0)
        else:
            self.gamepad.left_trigger(value=0)
        self.gamepad.update()
        time.sleep(.2)

    def press_and_release_l2_r2(self, button):
        self.press_l2_r2(button)
        self.release_l2_r2(button)

    def press_r2(self):
        self.press_l2_r2(button=vg.DS4_BUTTONS.DS4_BUTTON_TRIGGER_RIGHT)

    def release_r2(self):
        self.release_l2_r2(button=vg.DS4_BUTTONS.DS4_BUTTON_TRIGGER_RIGHT)

    def r2(self):
        self.press_and_release_l2_r2(button=vg.DS4_BUTTONS.DS4_BUTTON_TRIGGER_RIGHT)

    def press_l2(self):
        self.press_l2_r2(button=vg.DS4_BUTTONS.DS4_BUTTON_TRIGGER_LEFT)

    def release_l2(self):
        self.release_l2_r2(button=vg.DS4_BUTTONS.DS4_BUTTON_TRIGGER_LEFT)

    def l2(self):
        self.press_and_release_l2_r2(button=vg.DS4_BUTTONS.DS4_BUTTON_TRIGGER_LEFT)

    def press_left_joystick(self, x, y):
        self.gamepad.left_joystick(x, y)
        self.gamepad.update()
        time.sleep(0.2)

    def release_left_joystick(self):
        self.gamepad.left_joystick(128, 128)
        self.gamepad.update()
        time.sleep(0.2)

    def press_and_release_left_joystick(self, x, y):
        self.press_left_joystick(x, y)
        self.release_left_joystick()

    def press_right_joystick(self, x, y):
        self.gamepad.right_joystick(x, y)
        self.gamepad.update()
        time.sleep(0.2)

    def release_right_joystick(self):
        self.gamepad.right_joystick(128, 128)
        self.gamepad.update()
        time.sleep(0.2)

    def press_and_release_right_joystick(self, x, y):
        self.press_right_joystick(x, y)
        self.release_right_joystick()

    def press_normal_button(self, button, press_time=0.2):
        self.gamepad.press_button(button=button)
        self.gamepad.update()
        time.sleep(press_time)

    def release_normal_button(self, button):
        self.gamepad.release_button(button=button)
        self.gamepad.update()
        time.sleep(0.2)

    def press_and_release_normal_buttons(self, button, press_time=0.2):
        self.press_normal_button(button, press_time=press_time)
        self.release_normal_button(button)

    def press_direction_button(self, button):
        self.gamepad.directional_pad(button)
        self.gamepad.update()
        time.sleep(0.2)

    def release_direction_button(self):
        self.gamepad.directional_pad(vg.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_NONE)
        self.gamepad.update()
        time.sleep(0.1)

    def press_and_release_directions(self, button):
        self.press_direction_button(button)
        self.release_direction_button()

    def press_special_button(self, button):
        self.gamepad.press_special_button(special_button=button)
        self.gamepad.update()
        time.sleep(0.2)

    def release_special_button(self, button):
        self.gamepad.release_special_button(special_button=button)
        self.gamepad.update()
        time.sleep(0.2)

    def press_and_release_special_buttons(self, button):
        self.press_special_button(button)
        self.release_special_button(button)

    def press_l1(self):
        self.press_normal_button(button=vg.DS4_BUTTONS.DS4_BUTTON_SHOULDER_LEFT)

    def release_l1(self):
        self.release_normal_button(button=vg.DS4_BUTTONS.DS4_BUTTON_SHOULDER_LEFT)

    def l1(self):
        self.press_and_release_normal_buttons(button=vg.DS4_BUTTONS.DS4_BUTTON_SHOULDER_LEFT)

    def press_r1(self):
        self.press_normal_button(button=vg.DS4_BUTTONS.DS4_BUTTON_SHOULDER_RIGHT)

    def release_r1(self):
        self.release_normal_button(button=vg.DS4_BUTTONS.DS4_BUTTON_SHOULDER_RIGHT)

    def r1(self):
        self.press_and_release_normal_buttons(button=vg.DS4_BUTTONS.DS4_BUTTON_SHOULDER_RIGHT)

    def press_option(self):
        self.press_normal_button(button=vg.DS4_BUTTONS.DS4_BUTTON_OPTIONS)

    def release_option(self):
        self.release_normal_button(button=vg.DS4_BUTTONS.DS4_BUTTON_OPTIONS)

    def option(self):
        self.press_and_release_normal_buttons(button=vg.DS4_BUTTONS.DS4_BUTTON_OPTIONS)

    def press_cross(self):
        self.press_normal_button(button=vg.DS4_BUTTONS.DS4_BUTTON_CROSS)

    def release_cross(self):
        self.release_normal_button(button=vg.DS4_BUTTONS.DS4_BUTTON_CROSS)

    def cross(self):
        self.press_and_release_normal_buttons(button=vg.DS4_BUTTONS.DS4_BUTTON_CROSS)

    def press_circle(self):
        self.press_normal_button(button=vg.DS4_BUTTONS.DS4_BUTTON_CIRCLE)

    def release_circle(self):
        self.release_normal_button(button=vg.DS4_BUTTONS.DS4_BUTTON_CIRCLE)

    def circle(self, press_time=0.2):
        self.press_and_release_normal_buttons(button=vg.DS4_BUTTONS.DS4_BUTTON_CIRCLE, press_time=press_time)

    def press_triangle(self):
        self.press_normal_button(button=vg.DS4_BUTTONS.DS4_BUTTON_TRIANGLE)

    def release_triangle(self):
        self.release_normal_button(button=vg.DS4_BUTTONS.DS4_BUTTON_TRIANGLE)

    def triangle(self):
        self.press_and_release_normal_buttons(button=vg.DS4_BUTTONS.DS4_BUTTON_TRIANGLE)

    def press_square(self):
        self.press_normal_button(button=vg.DS4_BUTTONS.DS4_BUTTON_SQUARE)

    def release_square(self):
        self.release_normal_button(button=vg.DS4_BUTTONS.DS4_BUTTON_SQUARE)

    def square(self):
        self.press_and_release_normal_buttons(vg.DS4_BUTTONS.DS4_BUTTON_SQUARE)

    def press_right(self):
        self.press_direction_button(button=vg.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_EAST)

    def release_right(self):
        self.release_direction_button()

    def right(self):
        self.press_and_release_directions(vg.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_EAST)

    def press_left(self):
        self.press_direction_button(button=vg.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_WEST)

    def release_left(self):
        self.release_direction_button()

    def left(self):
        self.press_and_release_directions(vg.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_WEST)

    def press_up(self):
        self.press_direction_button(button=vg.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_NORTH)

    def release_up(self):
        self.release_direction_button()

    def up(self):
        self.press_and_release_directions(vg.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_NORTH)

    def press_down(self):
        self.press_direction_button(button=vg.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_SOUTH)

    def release_down(self):
        self.release_direction_button()

    def down(self):
        self.press_and_release_directions(vg.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_SOUTH)

    def press_upright(self):
        self.press_direction_button(button=vg.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_NORTHEAST)

    def release_upright(self):
        self.release_direction_button()

    def upright(self):
        self.press_and_release_directions(vg.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_NORTHEAST)

    def press_upleft(self):
        self.press_direction_button(button=vg.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_NORTHWEST)

    def release_upleft(self):
        self.release_direction_button()

    def upleft(self):
        self.press_and_release_directions(vg.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_NORTHWEST)

    def press_downright(self):
        self.press_direction_button(button=vg.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_SOUTHEAST)

    def release_downright(self):
        self.release_direction_button()

    def downright(self):
        self.press_and_release_directions(vg.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_SOUTHEAST)

    def press_downleft(self):
        self.press_direction_button(button=vg.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_SOUTHWEST)

    def release_downleft(self):
        self.release_direction_button()

    def downleft(self):
        self.press_and_release_directions(vg.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_SOUTHWEST)

    def press_ps(self):
        self.press_special_button(button=vg.DS4_SPECIAL_BUTTONS.DS4_SPECIAL_BUTTON_PS)

    def release_ps(self):
        self.release_special_button(button=vg.DS4_SPECIAL_BUTTONS.DS4_SPECIAL_BUTTON_PS)

    def ps(self):
        self.press_and_release_special_buttons(button=vg.DS4_SPECIAL_BUTTONS.DS4_SPECIAL_BUTTON_PS)

    def press_r3(self):
        self.press_normal_button(button=vg.DS4_BUTTONS.DS4_BUTTON_THUMB_RIGHT)

    def release_r3(self):
        self.release_normal_button(button=vg.DS4_BUTTONS.DS4_BUTTON_THUMB_RIGHT)

    def r3(self):
        self.press_and_release_normal_buttons(button=vg.DS4_BUTTONS.DS4_BUTTON_THUMB_RIGHT)

    def press_l3(self):
        self.press_normal_button(button=vg.DS4_BUTTONS.DS4_BUTTON_THUMB_LEFT)

    def release_l3(self):
        self.release_normal_button(button=vg.DS4_BUTTONS.DS4_BUTTON_THUMB_LEFT)

    def l3(self):
        self.press_and_release_normal_buttons(button=vg.DS4_BUTTONS.DS4_BUTTON_THUMB_LEFT)
