package net.a6te.lazycoder.muslim_pro_islamicremainders.MVP;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.support.v4.app.Fragment;

import net.a6te.lazycoder.muslim_pro_islamicremainders.BasicCalculation;
import net.a6te.lazycoder.muslim_pro_islamicremainders.GPSTracker;

public class QiblaPresenter implements MVPPresenter.QiblaPresenter{

    private Context context;
    private SensorManager sensorManager;
    private Sensor mSensor;
    private GPSTracker gps;
    double latitude, longitude;

    int Distance;
    double Qlati = 21.42243;
    double Qlongi = 39.82624;
    public static double degree;

    private BasicCalculation calculation;
    MVPView.QiblaView mvpView;


    private final SensorEventListener mListener = new SensorEventListener() {
        @Override
        public void onSensorChanged(SensorEvent event) {
            mvpView.changeCompassDirection(event.values[0], event.values[1], (float) degree);
        }
        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
        }
    };

    public QiblaPresenter(Fragment fragment, Context context) {
        this.context = context;
        mvpView = (MVPView.QiblaView) fragment;
        sensorManager = (SensorManager) context.getSystemService(context.SENSOR_SERVICE);
        calculation = new BasicCalculation();
        mSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);

    }

    @Override
    public void startCalculatingLocation() {
        if (!checkSensorAvailability(sensorManager)){

            //magnetic sensor not available in this device show this message to user
            mvpView.showSensorNotAvailable();
            return;
        }

        getLocation();//it will take location from location tracker
        Distance = calculation.getDistanceBetween(Qlati, Qlongi, latitude, longitude);
        degree = calculation.bearing(latitude, longitude, Qlati, Qlongi);
        calculateQiblaInfo();
    }

    @Override
    public boolean checkSensorAvailability(SensorManager mSensorManager){
        if (mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) != null){
            return true;
        }
        else {
            return false;
        }
    }

    @Override
    public void calculateQiblaInfo() {
        String qiblaDegree = String.format("%.2f", degree) + (char) 0x00B0;
        String distance = String.valueOf(Distance / 1000);

        mvpView.setQiblaInfo(qiblaDegree, distance);
    }

    private void getLocation() {
        // TODO Auto-generated method stub
        gps = new GPSTracker(context);
        // check if GPS enabled
        if (gps.canGetLocation()) {
            latitude = gps.getLatitude();
            longitude = gps.getLongitude();
        } else {
            gps.showSettingsAlert();
        }
    }
    @Override
    public void onResume() {
        sensorManager.registerListener(mListener,mSensor,SensorManager.SENSOR_DELAY_GAME);
    }
    @Override
    public void onPause() {
        sensorManager.unregisterListener(mListener);
    }

}