#
# Nintendo Wiimote controller class
#

package OpenGL::Earth::Wiimote;

use strict;
use Carp;

our $HAVE_WIIMOTE = 0;
our $HANDLE;

if ($^O =~ m{Linux}i) {
    eval 'use Linux::Input::Wiimote; $HAVE_WIIMOTE = 1;';
}

sub disconnect {
	my ($wii) = $HANDLE;
	$wii->disconnect();
}

sub fake_keys {
    my $keys = {};
}

sub get_keys {

	my ($wii) = $HANDLE;

    if (! $HAVE_WIIMOTE) {
        return fake_keys();
    }

	my $k = {};

    if ( $wii->get_wiimote_keys_home ) {
        $k->{home} = 1;
    }
    if ( $wii->get_wiimote_keys_up ) {
        $k->{up} = 1;
    }
    if ( $wii->get_wiimote_keys_down ) {
        $k->{down} = 1;
    }
    if ( $wii->get_wiimote_keys_left ) {
        $k->{left} = 1;
    }
    if ( $wii->get_wiimote_keys_right ) {
        $k->{right} = 1;
    }
    if ( $wii->get_wiimote_keys_a ) {
        $k->{'A'} = 1;
    }
    if ( $wii->get_wiimote_keys_b ) {
        $k->{'B'} = 1;
    }
    if ( $wii->get_wiimote_keys_1 ) {
        $k->{'1'} = 1;
    }
    if ( $wii->get_wiimote_keys_2 ) {
        $k->{'2'} = 1;
    }
    if ( $wii->get_wiimote_keys_minus ) {
        $k->{'-'} = 1;
    }
    if ( $wii->get_wiimote_keys_plus ) {
        $k->{'+'} = 1;
    }

	return $k;
}

sub fake_motion {

    my $motion = {
        axis_x => 0x7F,
        axis_y => 0x7F,
        axis_z => 0x7F,
        tilt_x => 0,
        tilt_y => 0,
        tilt_z => 0,
        force_x=> 1.0,
        force_y=> 0,
        force_z=> 0,
    };

    return $motion;
}

sub get_motion {

	my ($wii) = $HANDLE;

    # Return a fake no-motion struct
    if (! $HAVE_WIIMOTE) {
        return fake_motion();
    }

	$wii->wiimote_update();

	my $mt = {};

	$mt->{axis_x} = $wii->get_wiimote_axis_x();
    $mt->{axis_y} = $wii->get_wiimote_axis_y();
    $mt->{axis_z} = $wii->get_wiimote_axis_z();

	$mt->{tilt_x} = $wii->get_wiimote_tilt_x();
    $mt->{tilt_y} = $wii->get_wiimote_tilt_y();
    $mt->{tilt_z} = $wii->get_wiimote_tilt_z();

	$mt->{force_x} = $wii->get_wiimote_force_x();
    $mt->{force_y} = $wii->get_wiimote_force_y();
    $mt->{force_z} = $wii->get_wiimote_force_z();

	return $mt;
}

sub init {

    if (! $HAVE_WIIMOTE) {
        return;
    }

	my $wii = Linux::Input::Wiimote->new();
	my $addr = '00:1F:C5:06:5E:BB';

	my $connect = $wii->wiimote_connect($addr);
	if ($connect == -1 ) {
		carp "Can't connect to Wiimote at $addr\n";
	}

	# Init wiimote to receive appropriate sensors data
	$wii->wiimote_update();
	$wii->set_wiimote_rumble(0);
	$wii->set_wiimote_ir(1);
	$wii->activate_wiimote_accelerometer();

	return ($HANDLE = $wii);
}

1;