package com.manning.aip.mymoviesdatabase.data;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

import com.manning.aip.mymoviesdatabase.Constants;
import com.manning.aip.mymoviesdatabase.R;
import com.manning.aip.mymoviesdatabase.model.Category;

//
// SQLiteOpenHelper   
//
public class OpenHelper extends SQLiteOpenHelper {

   private static final int DATABASE_VERSION = 1;
   
   private Context context;

   OpenHelper(final Context context) {
      super(context, DataConstants.DATABASE_NAME, null, DATABASE_VERSION);
      this.context = context;
   }

   @Override
   public void onOpen(final SQLiteDatabase db) {
      super.onOpen(db);
      if (!db.isReadOnly()) {
         // Wersje SQLite'a starsze niż 3.6.19 nie obsługują kluczy obcych. Nie
         // robią tego także wersje skompilowane z opcją SQLITE_OMIT_FOREIGN_KEY
         // http://www.sqlite.org/foreignkeys.html#fk_enable
         // 
         // Należy włączyć obsługę kluczy obcych, jeśli jest to możliwe 
    	 // (i tak powinna być włączona, jednak warto się upewnić).          
         db.execSQL("PRAGMA foreign_keys=ON;");

         // Sprawdzanie, czy klucze obce są włączone. Jeśli zapytanie nie zwraca danych, nie 
         // należy nawet PRÓBOWAĆ korzystaćz takich kluczy.
         Cursor c = db.rawQuery("PRAGMA foreign_keys", null);
         if (c.moveToFirst()) {
            int result = c.getInt(0);
            Log.i(Constants.LOG_TAG, "Obsługa kluczy obcych (1 = tak, 0 = nie): " + result);
         } else {
            // Można zastosować to podejście w metodzie onCreate i na przykład nie używać  
        	// kluczy obcych, jeśli nie są dostępne.
            Log.i(Constants.LOG_TAG, "BRAK obsługi kluczy obcych");
            // W razie konieczności tu można przełączyć się na kod 
            // oparty na wyzwalaczach.
         }
         if (!c.isClosed()) {
            c.close();
         }
      }
   }

   @Override
   public void onCreate(final SQLiteDatabase db) {
      Log.i(Constants.LOG_TAG, "Tworzenie bazy w metodzie onCreate klasy DataHelper.OpenHelper " + DataConstants.DATABASE_NAME);

      CategoryTable.onCreate(db);
      // Tworzenie kategorii (to jeden z możliwych sposobów; dobrze sprawdza się , jeśli danych
      // jest mało). To tylko demonstracja techniki - w aplikacji menedżer kategorii nie jest potrzebny.
      CategoryDao categoryDao = new CategoryDao(db);
      String[] categories = context.getResources().getStringArray(R.array.tmdb_categories);
      for (String cat : categories) {
         categoryDao.save(new Category(0, cat));
      }

      MovieTable.onCreate(db);

      MovieCategoryTable.onCreate(db);
   }

   @Override
   public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) {
      Log
               .i(Constants.LOG_TAG, "SQLiteOpenHelper onUpgrade - oldVersion:" + oldVersion + " newVersion:"
                        + newVersion);

      MovieCategoryTable.onUpgrade(db, oldVersion, newVersion);

      MovieTable.onUpgrade(db, oldVersion, newVersion);

      CategoryTable.onUpgrade(db, oldVersion, newVersion);
   }
}
