package net.qiujuer.tips.factory.service;

import android.app.AlarmManager;
import android.app.Application;
import android.app.PendingIntent;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.support.annotation.Nullable;

import net.qiujuer.tips.factory.model.Model;

import java.util.Calendar;

public class MissService extends Service {
    private final static String TAG = MissService.class.getName();
    public final static String ACTION_MISS_MAIN = "net.qiujuer.tips.factory.service.MissService.MISS_MAIN";
    public final static String ACTION_MISS_WIDGET = "net.qiujuer.tips.factory.service.MissService.MISS_WIDGET";
    public final static String ACTION_MISS_WIDGET_VALUES = "VALUES";
    public final static String ACTION_MISS_WIDGET_REFRESH = "net.qiujuer.tips.factory.service.MissService.MISS_WIDGET_REFRESH";
    public final static String ACTION_MISS_SYNC = "net.qiujuer.tips.factory.service.MissService.MISS_SYNC";
    public final static String ACTION_MISS_SYNC_VALUE_STATUS = "STATUS";

    private static final int INTERVAL = 1000 * 60 * 60 * 24;

    private MissServiceBroadcastReceiver mReceiver;

    public static void start(Context context) {
        try {
            Intent serviceIntent = new Intent(context, MissService.class);
            context.startService(serviceIntent);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Model.log(TAG, "onCreate");

        Application application = getApplication();
        mReceiver = new MissServiceBroadcastReceiver();

        try {
            IntentFilter filter = new IntentFilter();
            filter.addAction(ACTION_MISS_WIDGET_REFRESH);
            application.registerReceiver(mReceiver, filter);
        } catch (Exception e) {
            e.printStackTrace();
        }

        // Register Alarm
        addAlarm(getApplication());
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);

        Model.log(TAG, "onStartCommand");

        // Refresh at once
        MissBinder.getInstance(this).orderAsync();

        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        MissServiceBroadcastReceiver receiver = mReceiver;
        mReceiver = null;
        Application application = Model.getApplication();
        if (receiver != null && application != null) {
            try {
                application.unregisterReceiver(receiver);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        super.onDestroy();

        if (application != null)
            MissService.start(application);
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    private void addAlarm(Context context) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        calendar.add(Calendar.DATE, 1);

        final long startTime = calendar.getTimeInMillis();

        // Service intent
        Intent intent = new Intent(context, MissAlarmService.class);
        PendingIntent sender = PendingIntent.getService(context, 0, intent, 0);

        // Schedule the alarm
        AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        if (am == null) {
            return;
        }
        am.cancel(sender);
        am.setRepeating(AlarmManager.RTC, startTime, INTERVAL, sender);
    }

    public class MissServiceBroadcastReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (ACTION_MISS_WIDGET_REFRESH.equals(action)) {
                MissBinder.getInstance(context).refreshWidget();
            }
        }
    }
}