package kz.arta.synergy.workflow.mobile.android;

import android.accounts.Account;
import android.accounts.AccountManager;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.widget.Toast;

import com.google.gson.Gson;

import java.util.HashMap;
import java.util.Map;

import kz.arta.synergy.workflow.mobile.android.authorization.SynergyAccount;
import kz.arta.synergy.workflow.mobile.android.common.SettingsConst;
import kz.arta.synergy.workflow.mobile.android.common.models.Person;
import kz.arta.synergy.workflow.mobile.android.common.requests.Positions;
import kz.arta.synergy.workflow.mobile.android.common.utils.DateUtils;
import kz.arta.synergy.workflow.mobile.android.common.utils.Utils;

/**
 * Created by neox on 22.08.14.
 * Сервис для получения и отправки данных о местоположении пользователя
 */
public class AlarmManagerPosition extends BroadcastReceiver {

    final public static String POSITION = "POSITION";
    final LocationListener mLocationListener = new LocationListener() {
        @Override
        public void onLocationChanged(final Location location) {
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
        }

        @Override
        public void onProviderEnabled(String provider) {
        }

        @Override
        public void onProviderDisabled(String provider) {
        }
    };

    @Override
    public void onReceive(Context context, Intent intent) {
        LocationManager locManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        SharedPreferences settings = context.getSharedPreferences(SettingsConst.DEFAULT_NAME_SETTINGS, Context.MODE_PRIVATE);
        Bundle extras = intent.getExtras();
        // ловим интент
        if (extras != null && !extras.getBoolean(POSITION, Boolean.FALSE)) {
            AccountManager accountManager = AccountManager.get(context);
            // получаем существующие аккаунты в систее
            Account[] accounts = accountManager.getAccounts();
            // пробегаемся по всем найденным и ищем нужный
            for (Account account : accounts) {
                // если найден - формируем объект person
                if (account.type.equals(SynergyAccount.TYPE)) {
                    Person person = new Person();
                    person.setPassword(accountManager.getPassword(account));
                    person.setLogin(accountManager.getUserData(account, SynergyAccount.LOGIN));
                    person.setHost(accountManager.getUserData(account, SynergyAccount.HOST));
                    person.setShortHost(accountManager.getUserData(account, SynergyAccount.SHORT_HOST));
                    person.setUuid(accountManager.getUserData(account, SynergyAccount.USER_ID));
                    person.setFirstname(accountManager.getUserData(account, SynergyAccount.FIRSTNAME));
                    person.setLastname(accountManager.getUserData(account, SynergyAccount.LASTNAME));
                    // здесь будут находиться координаты
                    Location location = null;
                    // если GPS провайдер доступен - получаем координаты по нему, иначе через NETWORK
                    if (locManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
                        // обновляем текущее местопложение
                        if (ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                            // TODO: Consider calling
                            //    ActivityCompat#requestPermissions
                            // here to request the missing permissions, and then overriding
                            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                            //                                          int[] grantResults)
                            // to handle the case where the user grants the permission. See the documentation
                            // for ActivityCompat#requestPermissions for more details.
                            return;
                        }
                        locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                                Long.parseLong(settings.getString(SettingsConst.PERIOD_MILLISECONDS_POSITION, "")), 0, mLocationListener);
                        // получаем последние известные координаты
                        location = locManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                    } else if (locManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
                        // обновляем текущее местопложение
                        locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
                                Long.parseLong(settings.getString(SettingsConst.PERIOD_MILLISECONDS_POSITION, "")), 0, mLocationListener);
                        // получаем последние известные координаты
                        location = locManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                    }
                    // если местоположение найдено и есть соединение с интернетом - формируем строку и отправляем на сервер
                    if (location != null) {
                        if (Utils.isOnline(context, null)) {
                            Map<String, String> data = new HashMap<String, String>();
                            // имя пользователя
                            data.put("user", person.getUserName());
                            // uuid пользователя
                            data.put("userID", person.getUuid());
                            // дата получения координат
                            data.put("locDate", DateUtils.getDateFromMilliseconds(String.valueOf(System.currentTimeMillis())));
                            // широта
                            data.put("lat", String.valueOf(location.getLatitude()));
                            // долгота
                            data.put("lon", String.valueOf(location.getLongitude()));
                            // и отправляем полученную строку на сервер
                            new Positions(person, new Gson().toJson(data)).execute();
                        } else {
                            Toast.makeText(context, "Мы не онлайн", Toast.LENGTH_LONG).show();
                        }
                    } else {
                        Toast.makeText(context, "Не могу определить местоположение", Toast.LENGTH_LONG).show();
                    }
                    break;
                }
            }
        }
    }

    /**
     * Включение будильника
     *
     * @param context контекст
     */
    public void setAlarm(Context context) {
        SharedPreferences mSettings = context.getSharedPreferences(SettingsConst.DEFAULT_NAME_SETTINGS, Context.MODE_PRIVATE);
        AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, AlarmManagerPosition.class);
        intent.putExtra(POSITION, Boolean.FALSE);
        PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
        am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),
                Long.parseLong(mSettings.getString(SettingsConst.PERIOD_MILLISECONDS_POSITION, "")), pi);
    }

    /**
     * Выключение будильника
     *
     * @param context контекст
     */
    public void cancelAlarm(Context context) {
        Intent intent = new Intent(context, AlarmManagerPosition.class);
        PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(sender);
    }
}