//
//  Deserializing_JSON_into_Arrays_and_DictionariesAppDelegate.m
//  Deserializing JSON into Arrays and Dictionaries
//
//  Created by Vandad Nahavandipoor on 20/07/2011.
//  Copyright 2011 Pixolity Ltd. All rights reserved.
//

#import "Deserializing_JSON_into_Arrays_and_DictionariesAppDelegate.h"

@implementation Deserializing_JSON_into_Arrays_and_DictionariesAppDelegate

@synthesize window = _window;

- (BOOL)            application:(UIApplication *)application 
  didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
  
  NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
  
  [dictionary setValue:@"Antoni"
                forKey:@"First Name"];
  
  [dictionary setValue:@"Nowak"
                forKey:@"Last Name"];
  
  [dictionary setValue:[NSNumber numberWithUnsignedInteger:51]
                forKey:@"Age"];
  
  NSArray *arrayOfAnthonysChildren = [[NSArray alloc] 
                                      initWithObjects:
                                      @"Pierwszy syn Antoniego", 
                                      @"Pierwsza córka Antoniego",
                                      @"Drugi syn Antoniego",
                                      @"Trzeci syn Antoniego",
                                      @"Druga córka Antoniego",
                                      nil];
  
  [dictionary setValue:arrayOfAnthonysChildren
                forKey:@"children"];
  
  NSError *error = nil;
  NSData *jsonData = [NSJSONSerialization 
                      dataWithJSONObject:dictionary
                      options:NSJSONWritingPrettyPrinted
                      error:&error];
  
  if ([jsonData length] > 0 &&
      error == nil){
    
    NSLog(@"Serializacja słownika zakończyła się powodzeniem.");
    
    /* Teraz przeprowadzimy deserializację obiektu JSON na postać słownika. */
    error = nil;
    id jsonObject = [NSJSONSerialization 
                     JSONObjectWithData:jsonData
                     options:NSJSONReadingAllowFragments
                     error:&error];
    
    if (jsonObject != nil &&
        error == nil){
      
      NSLog(@"Deserializacja zakończyła się powodzeniem...");
      
      if ([jsonObject isKindOfClass:[NSDictionary class]]){
        
        NSDictionary *deserializedDictionary = (NSDictionary *)jsonObject;
        NSLog(@"Słownik po deserializacji obiektu JSON = %@", deserializedDictionary);
        
      }
      else if ([jsonObject isKindOfClass:[NSArray class]]){
        
        NSArray *deserializedArray = (NSArray *)jsonObject;
        NSLog(@"Tablica po deserializacji obiektu JSON = %@", deserializedArray);
        
      }
      else {
        /* Zwrócony został obiekt innego typu. Nie wiadomo, co należy zrobić
      w tej sytuacji, ponieważ deserializacja powinna zwrócić obiekt słownika lub tablicy */
      }
      
    }
    else if (error != nil){
      NSLog(@"Wystąpił błąd podczas deserializacji danych JSON.");
    }
    
  }
  else if ([jsonData length] == 0 &&
           error == nil){
    
    NSLog(@"Serializacja nie wygenerowała żadnych danych.");
    
  }
  else if (error != nil){
    
    NSLog(@"Wystąpił błąd = %@", error);
    
  }
  
  
  self.window = [[UIWindow alloc] initWithFrame:
                 [[UIScreen mainScreen] bounds]];
  // Miejsce na przeprowadzenie własnej konfiguracji po uruchomieniu aplikacji.
  self.window.backgroundColor = [UIColor whiteColor];
  [self.window makeKeyAndVisible];
  return YES;
}

- (void)applicationWillResignActive:(UIApplication *)application
{
  /*
   Ta metoda jest wywoływana, gdy aplikacja przechodzi ze stanu aktywnego do nieaktywnego. Może być wywołana w określonych sytuacjach (na przykład w chwili odbywania rozmowy telefonicznej lub po otrzymaniu wiadomości SMS) bądź kiedy użytkownik kończy działanie aplikacji. Metoda rozpoczyna proces przejścia do stanu pozostania w tle. Tę metodę można wykorzystać do wstrzymania wykonywania bieżących zadań, wyłączenia liczników czasu, zmniejszenia liczby klatek generowanych przez OpenGL ES. W grach ta metoda powinna być użyta do wstrzymania gry (pauza).
   */
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
  /*
   Tę metodę należy wykorzystać do zwolnienia zasobów współdzielonych, zapisania danych użytkownika, wyzerowania liczników czasu oraz do przechowania takiej ilości informacji o stanie, która pozwoli na przywrócenie aplikacji do stanu bieżącego. Jeżeli aplikacja obsługuje działanie w tle, w chwili kończenia działania należy wywołać tę metodę zamiast applicationWillTerminate:.
   */
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
  /*
   Ta metoda jest wywoływana podczas przechodzenia aplikacji ze stanu aktywnego do działania w tle. Można więc tutaj wycofać wiele zmian wprowadzonych w chwili przechodzenia do stanu działania w tle.
   */
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
  /*
   W tej metodzie można wznowić działanie zadań zatrzymanych (lub nieuruchomionych), gdy aplikacja była nieaktywna. Jeżeli aplikacja znajdowała się w trybie działania w tle, w metodzie można przeprowadzić odświeżenie interfejsu użytkownika.
   */
}

- (void)applicationWillTerminate:(UIApplication *)application
{
  /*
   Ta metoda jest wywoływana, gdy działanie aplikacji ma zostać zakończone. Zapoznaj się z opisem metody applicationDidEnterBackground:.
   */
}

@end
