package com.manning.aip.tabdroid;

import android.app.IntentService;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.BitmapFactory;
import android.os.SystemClock;
import android.util.Log;

import java.util.ArrayList;
import java.util.List;

import com.manning.aip.dealdroid.Constants;
import com.manning.aip.dealdroid.DealsApp;

//Klasa IntentService kolejkuje wywołania startService(Intent) za pomocą onHandleIntent i kończy pracę.
//
//UWAGA: w tej implementacji celowo nie używamy klas PowerManager/WakeLock ani nie uwzględniamy problemów z energią.
//Jeśli urządzenie jest uśpione, AlarmManager wzbudza je przy zdarzeniu onReceiver odbiornika
//BroadcastReceiver, ale następnie znów urządzenie może przejść w stan uśpienia.
//Można użyć obiektu PowerManager i zająć blokadę WakeLock, jednak także to podejście
//nie jest doskonałe. 
//Problem można rozwiązać, jednak w tym przykładzie takie komplikacje nie sa konieczne.
//Nic się nie stanie, jeśli użytkownik nie zobaczy nowych ofert do momentu uruchomienia telefonu
//i przesłania powiadomień.

public class DealService extends IntentService {

   private static int count;

   private DealsApp app;

   public DealService() {
      super("Deal Service");
   }

   @Override
   public void onStart(Intent intent, int startId) {
      super.onStart(intent, startId);
   }

   @Override
   public void onHandleIntent(Intent intent) {
      Log.i(Constants.LOG_TAG, "Wywołano DealService; wyszukiwanie nowy ofert (powiadamia o obecności)");
      this.app = (DealsApp) getApplication();
      if (app.connectionPresent()) {
         // Przetwarzanie danych z kanału RSS.
         app.sectionList = app.parser.parse();

         // Pobieranie listy identyfikatorów currentDealIds z pierwszej kategorii 
         // (Daily Deals, zawsze 4 elementy).
         List<Long> currentDealIds = app.parseItemsIntoDealIds(app.sectionList.get(0).items);         

         // Poprzednie oferty są zapisane jako ustawienia, ponieważ proste dane łatwiej przechowywać w ten sposób 
         // niż w plikach. Ponadto potrzebny jest trwały mechanizm na dane po wznowieniu pracy usługi 
         // (pamięć aplikacji może zostać wyczyszczona).
         List<Long> previousDealIds = app.getPreviousDealIdsFromPrefs();

         // Zapisywanie obecnego identyfikatora currentDealIds jako 
         // dawnego, co zapewnia aktualne dane przy późniejszym wznowieniu.
         app.setPreviousDealIdsToPrefs(currentDealIds);

         // Czy istnieją NOWE identyfikatory?
         List<Long> newDealIdsList = this.checkForNewDeals(previousDealIds, currentDealIds);
         if (!newDealIdsList.isEmpty()) {
            this.sendNotification(this, newDealIdsList.size());
         }
                
         count++;
         if (count == 1) {
            SystemClock.sleep(5000);
            this.sendNotification(this, 1);
         }
         
      } else {
         Log.w(Constants.LOG_TAG, "Brak połączenia; nie można sprawdzić ofert");
      }
   }

   // Zamiast używać całego elementu, korzystamy z pola itemId; 
   // jest unikatowe i pozwala stwierdzić, które oferty są nowe.         
   private List<Long> checkForNewDeals(final List<Long> previousDealIds, final List<Long> currentDealIds) {
      List<Long> newDealsList = new ArrayList<Long>();
      for (Long id : currentDealIds) {
         if ((id != 0) && !previousDealIds.contains(id)) {
            Log.d(Constants.LOG_TAG, "Znaleziono nowe oferty: " + id);
            newDealsList.add(id);
         }
      }
      return newDealsList;
   }

   private void sendNotification(final Context context, final int numNewDeals) {
      Intent notificationIntent = new Intent(context, DealsMain.class);
      notificationIntent.putExtra(Constants.FORCE_RELOAD, true);
      PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);

      NotificationManager notificationMgr =
               (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
//      Notification notification =
//               new Notification(android.R.drawable.star_on, getString(R.string.deal_service_ticker), System
//                        .currentTimeMillis());
//      notification.flags |= Notification.FLAG_AUTO_CANCEL;
//      notification.setLatestEventInfo(context, getResources().getString(R.string.deal_service_title), getResources()
//               .getQuantityString(R.plurals.deal_service_new_deal, numNewDeals, numNewDeals), contentIntent);
//      notificationMgr.notify(0, notification);
      Resources res = getResources();
      Notification.Builder builder = new Notification.Builder(this);
      builder.setContentIntent(contentIntent)
      	.setSmallIcon(android.R.drawable.star_on)
      	.setLargeIcon(BitmapFactory.decodeResource(res, R.drawable.ddicon))
      	.setTicker(res.getString(R.string.deal_service_ticker))
      	.setWhen(System.currentTimeMillis())
      	.setAutoCancel(true)
      	.setNumber(numNewDeals)
      	.setContentTitle(res.getString(R.string.deal_service_title))
      	.setContentText(res.getQuantityString(
      			R.plurals.deal_service_new_deal, numNewDeals, numNewDeals));
      Notification n = builder.getNotification();
      notificationMgr.notify(0, n);
   }
}
