package com.manning.aip.dealdroid;

import android.app.Application;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.NetworkInfo.State;
import android.util.Log;

import com.manning.aip.dealdroid.model.Item;
import com.manning.aip.dealdroid.model.Section;
import com.manning.aip.dealdroid.xml.DailyDealsFeedParser;
import com.manning.aip.dealdroid.xml.DailyDealsXmlPullFeedParser;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class DealDroidApp extends Application {

   private ConnectivityManager cMgr;
   private DailyDealsFeedParser parser;
   private List<Section> sectionList;
   private Map<Long, Bitmap> imageCache;
   private Item currentItem;
   
   //
   // Procedury pobierające i ustawiające.
   //
   public DailyDealsFeedParser getParser() {
      return this.parser;
   }

   public List<Section> getSectionList() {
      return this.sectionList;
   }

   public Map<Long, Bitmap> getImageCache() {
      return this.imageCache;
   }

   public Item getCurrentItem() {
      return this.currentItem;
   }

   public void setCurrentItem(Item currentItem) {
      this.currentItem = currentItem;
   }

   //
   // Obsługa cyklu życia.
   //
   @Override
   public void onCreate() {
      super.onCreate();
      this.cMgr = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
      this.parser = new DailyDealsXmlPullFeedParser();
      this.sectionList = new ArrayList<Section>(6);
      this.imageCache = new HashMap<Long, Bitmap>();
   }

   @Override
   public void onTerminate() {
      // Nie ma gwarancji, że zostanie wywołana.
      super.onTerminate();
   }

   //
   // Metody pomocnicze (używane przez więcej niż jedną inną aktywność, 
   // dlatego umieszczono je tutaj. Można umieścić je także w klasie narzędziowej).
   //
   public Bitmap retrieveBitmap(String urlString) {
      Log.d(Constants.LOG_TAG, "Wywołanie HTTP w celu pobrania rysunku:" + urlString);
      Bitmap bitmap = null;
      try {
         URL url = new URL(urlString);
         // UWAGA - nie ograniczaj się do wywołania "url.openStream()".  
         // Jest to skrócony odpowiednik wywołania openConnection().getInputStream(), który nie ustawia limitu czasu.
         // Wartość domyślna to nieskonczoność, dlatego aplikacja czeka wtedy bez końca na serwer, jeśli ten nie działa.
         // Kilka dodatkowych wierszy pozwala utworzyć poprawne rozwiązanie.         
         URLConnection conn = url.openConnection();     
         conn.setConnectTimeout(3000);
         conn.setReadTimeout(5000);         
         bitmap = BitmapFactory.decodeStream(conn.getInputStream());
      } catch (MalformedURLException e) {
         Log.e(Constants.LOG_TAG, "Wyjątek w czasie pobierania obrazu - błędny adres URL", e);
      } catch (IOException e) {
         Log.e(Constants.LOG_TAG, "Wyjątek w czasie pobierania obrazu - błąd wejścia-wyjścia", e);
      } 
      return bitmap;
   }

   public boolean connectionPresent() {
      NetworkInfo netInfo = cMgr.getActiveNetworkInfo();
      if ((netInfo != null) && (netInfo.getState() != null)) {
         return netInfo.getState().equals(State.CONNECTED);
      } 
      return false;
   }
}