package com.example.windowviewdebug;

import android.annotation.TargetApi;
import android.content.pm.ActivityInfo;
import android.hardware.SensorManager;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.view.GravityCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;

import com.jmedeisis.windowview.sensor.TiltSensor;

public class DebugActivity extends AppCompatActivity {

    private static final String ORIENTATION = "orientation";
    private static final String DEBUG_TILT = "debugTilt";
    private static final String DEBUG_IMAGE = "debugImage";
    private boolean debugTilt;
    private boolean debugImage;
    private TiltSensor tiltSensor;
    private DebugWindowView windowView1;
    private DebugWindowView windowView2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_debug);

        tiltSensor = new TiltSensor(this, true);

        windowView1 = (DebugWindowView) findViewById(R.id.windowView1);
        windowView2 = (DebugWindowView) findViewById(R.id.windowView2);

        // use one TiltSensor to drive both WindowViews
        windowView1.attachTiltTracking(tiltSensor);
        windowView2.attachTiltTracking(tiltSensor);

        View.OnClickListener onClickListener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                resetTiltSensorOrientationOrigin();
            }
        };
        windowView1.setOnClickListener(onClickListener);
        windowView2.setOnClickListener(onClickListener);

        if (null != savedInstanceState && savedInstanceState.containsKey(ORIENTATION)
                && savedInstanceState.containsKey(DEBUG_TILT)
                && savedInstanceState.containsKey(DEBUG_IMAGE)) {
            //noinspection ResourceType
            setRequestedOrientation(savedInstanceState.getInt(ORIENTATION));
            debugTilt = savedInstanceState.getBoolean(DEBUG_TILT);
            debugImage = savedInstanceState.getBoolean(DEBUG_IMAGE);

            windowView1.setDebugEnabled(debugTilt, debugImage);
            windowView2.setDebugEnabled(debugTilt, debugImage);
        } else {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // default
            debugTilt = false;
            debugImage = false;
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        tiltSensor.startTracking(SensorManager.SENSOR_DELAY_FASTEST);
    }

    @Override
    public void onPause() {
        super.onPause();
        tiltSensor.stopTracking();
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt(ORIENTATION, getRequestedOrientation());
        outState.putBoolean(DEBUG_TILT, debugTilt);
        outState.putBoolean(DEBUG_IMAGE, debugImage);
    }

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_debug, menu);

        menu.findItem(R.id.action_lock_portrait)
                .setChecked(getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        menu.findItem(R.id.action_debug_tilt).setChecked(debugTilt);
        menu.findItem(R.id.action_debug_image).setChecked(debugImage);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            // display 3D-ish icon representation of absolute device orientation
            final View actionView = View.inflate(this, R.layout.device_compass, null);
            final View xy = actionView.findViewById(R.id.compass_xy);
            final View z = actionView.findViewById(R.id.compass_z);
            tiltSensor.addListener(new TiltSensor.TiltListener() {
                @Override
                public void onTiltUpdate(float yaw, float pitch, float roll) {
                    xy.setRotation(yaw);
                    xy.setRotationX(pitch);
                    xy.setRotationY(roll);

                    z.setRotation(yaw);
                    z.setRotationX(pitch);
                    z.setRotationY(roll - 90);
                }
            });
            actionView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    resetTiltSensorOrientationOrigin();
                }
            });
            actionView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    Toast t = Toast.makeText(DebugActivity.this,
                            R.string.action_reset_orientation, Toast.LENGTH_SHORT);
                    int[] pos = new int[2];
                    actionView.getLocationInWindow(pos);
                    t.setGravity(Gravity.TOP | GravityCompat.START,
                            pos[0], pos[1] + actionView.getHeight() / 2);
                    t.show();
                    return true;
                }
            });


            menu.findItem(R.id.action_reset_orientation).setActionView(actionView);
        }

        return true;
    }

    private void resetTiltSensorOrientationOrigin() {
        tiltSensor.resetOrigin(false);
        Toast.makeText(DebugActivity.this, R.string.hint_orientation_reset, Toast.LENGTH_SHORT).show();
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_lock_portrait:
                item.setChecked(!item.isChecked());
                if (item.isChecked()) {
                    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                } else {
                    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
                }
                return true;
            case R.id.action_debug_tilt:
                item.setChecked(!item.isChecked());
                debugTilt = item.isChecked();
                windowView1.setDebugEnabled(debugTilt, debugImage);
                windowView2.setDebugEnabled(debugTilt, debugImage);
                return true;
            case R.id.action_debug_image:
                item.setChecked(!item.isChecked());
                debugImage = item.isChecked();
                windowView1.setDebugEnabled(debugTilt, debugImage);
                windowView2.setDebugEnabled(debugTilt, debugImage);
                return true;
        }
        return super.onOptionsItemSelected(item);
    }
}