package com.duy.compass.location;

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationManager;
import android.os.Build;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.widget.Toast;

import com.duy.compass.R;
import com.duy.compass.fragments.CompassFragment;
import com.duy.compass.utils.DLog;
import com.duy.compass.utils.Utility;
import com.duy.compass.location.model.LocationData;
import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.tasks.OnSuccessListener;

import static com.google.android.gms.location.LocationServices.getFusedLocationProviderClient;

/**
 * Created by Duy on 10/16/2017.
 */

public class LocationHelper {
    private static final int REQUEST_CODE = 1111;
    private static final String TAG = "LocationHelper";
    private Context mContext;
    private CompassFragment mFragment;
    @Nullable
    private LocationListener mLocationListener;
    @Nullable
    private LocationDataChangeListener mLocationValueListener;

    public LocationHelper(CompassFragment fragment) {
        this.mContext = fragment.getContext();
        this.mFragment = fragment;
    }

    @SuppressWarnings("MissingPermission")
    public void onCreate() {
        DLog.d(TAG, "onCreate() called");
        if (permissionGranted()) {
            if (!Utility.isNetworkAvailable(mContext)) {
                return;
            }
            LocationManager locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
            mLocationListener = new LocationListener(mContext);
            mLocationListener.setLocationValueListener(mLocationValueListener);
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 10, mLocationListener);
            FusedLocationProviderClient client = getFusedLocationProviderClient(mContext);
            client.getLastLocation().addOnSuccessListener(new OnSuccessListener<Location>() {
                @Override
                public void onSuccess(Location location) {
                    // Got last known location. In some rare situations this can be null.
                    if (location != null) {
                        // Logic to handle location object
                        mLocationListener.onLocationChanged(location);
                    }
                }
            });
        } else {
            requestPermission();
        }
    }

    private boolean permissionGranted() {
        return ContextCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION)
                == PackageManager.PERMISSION_GRANTED
                && ContextCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION)
                == PackageManager.PERMISSION_GRANTED;
    }

    private void requestPermission() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            mFragment.requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION,
                    Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_CODE);
        }
    }

    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (grantResults[0] != PackageManager.PERMISSION_GRANTED
                || grantResults[1] != PackageManager.PERMISSION_GRANTED) {
            /*requestPermission();*/
            Toast.makeText(mContext, R.string.permission_denide, Toast.LENGTH_SHORT).show();
        } else {
            onCreate();
        }
    }

    public void setLocationValueListener(LocationDataChangeListener locationValueListener) {
        this.mLocationValueListener = locationValueListener;
        if (mLocationListener != null) {
            mLocationListener.setLocationValueListener(locationValueListener);
        }
    }

    public void networkUnavailable() {

    }

    public interface LocationDataChangeListener {
        void onUpdateLocationData(@Nullable LocationData locationData);
    }
}