//
//  TutorialMode.m
//  Cart Collect
//
//  Created by Starla Insigna on 8/10/11.
//  Copyright 2011 Four Island. All rights reserved.
//

#import "TutorialMode.h"
#import "FallingObject.h"
#import "Cherry.h"
#import "Bottle.h"
#import "OneUp.h"
#import "Rock.h"
#import "GameModeSelectionLayer.h"

// Item tags:
//    2000 - first dropped item
//    2001 - item that is dropped after you catch first dropped item to demonstrate what happens when you miss
//    2002 - items that are dropped after you miss first dropped item to demonstrate what happens when you catch
//    2003 - 1-Up
//    2009 - rock
//    2010 - random item dropped after death from first rock

@implementation TutorialMode

@synthesize currentTutorial;

- (id)init
{
    self = [super init];
    
    if (nil != self)
    {
        CCSprite* backgroundImage = [CCSprite spriteWithFile:@"SeaBeach.png"];
		backgroundImage.position = ccp(240, 160);
		[self addChild:backgroundImage z:-1];
        
        showedDeathBubble = NO;
        randomItemsDropped = 0;
    }
    
    return self;
}

- (void)onEnterTransitionDidFinish
{
    [super onEnterTransitionDidFinish];
    
    [self scheduleDelayedAction:^{
        TutorialBubble* bubble = [[TutorialBubble alloc] initWithText:@"Welcome to Cart Collect. This is a tutorial designed to help you get started playing the game. Below this bubble is a cart. Tilt your device to move it." name:@"cart" spriteReference:cart.sprite];
        self.currentTutorial = bubble;
        [bubble release];
    } delay:2.0f];
}

- (void)tick:(ccTime)dt
{
    [super tick:dt];
    
    FallingObject* object = [objects anyObject];
    if ((object.sprite.tag == 2000) && (object.sprite.position.y == 360-object.weight*14))
    {
        TutorialBubble* bubble = [[TutorialBubble alloc] initWithText:@"This is an item. Try to catch it with your cart." name:@"item" spriteReference:object.sprite];
        self.currentTutorial = bubble;
        [bubble release];
    } else if ((object.sprite.tag == 2003) && (object.sprite.position.y == 360-object.weight*8))
    {
        TutorialBubble* bubble = [[TutorialBubble alloc] initWithText:@"This is a 1-Up. Catch it to gain an extra life. There's no penalty for not catching it, though." name:@"oneup" spriteReference:object.sprite];
        self.currentTutorial = bubble;
        [bubble release];
    } else if ((object.sprite.tag == 2009) && (object.sprite.position.y == 360-object.weight*14))
    {
        TutorialBubble* bubble = [[TutorialBubble alloc] initWithText:@"This is a rock. It would be better for your health if you did not catch this item." name:@"rock" spriteReference:object.sprite];
        self.currentTutorial = bubble;
        [bubble release];
    }
}

- (void)didCatchItem:(FallingObject *)item
{
    if (item.sprite.tag == 2000)
    {
        TutorialBubble* bubble = [[TutorialBubble alloc] initWithText:@"Congratulations! If you look at your score, you'll see it increased. Catching items is good. Now, let's see what happens when you don't catch an item." name:@"caught-first"];
        self.currentTutorial = bubble;
        [bubble release];
    } else if (item.sprite.tag == 2002)
    {
        TutorialBubble* bubble = [[TutorialBubble alloc] initWithText:@"There you go! If you look at your score, you'll see it increased. Catching items is good." name:@"caught-second"];
        self.currentTutorial = bubble;
        [bubble release];
    }
}

- (void)didMissItem:(FallingObject *)item
{
    if (item.sprite.tag == 2000)
    {
        TutorialBubble* bubble = [[TutorialBubble alloc] initWithText:@"Whoops, you missed it! Look at your lives counter--you lost one! If you lose all of your lives, you lose the game. Try catching the item again." name:@"missed-first"];
        self.currentTutorial = bubble;
        [bubble release];
    } else if (item.sprite.tag == 2001)
    {
        [cart setImmobile:NO];
        
        TutorialBubble* bubble = [[TutorialBubble alloc] initWithText:@"You lost a life! You only have three lives, so try not to miss any items! However..." name:@"missed-second"];
        self.currentTutorial = bubble;
        [bubble release];
    } else if (item.sprite.tag == 2002)
    {
        [self scheduleDelayedAction:^{
            FallingObject* object = [self dropRandomItem];
            object.sprite.tag = 2002;
            [object release];
        } delay:1.0f];
    }
}

- (void)didDestroyItem:(FallingObject *)item
{
    if (item.sprite.tag == 2003)
    {
        [self schedule:@selector(randomlyAddObject:) interval:2.5f];
    } else if (item.sprite.tag == 2009)
    {
        if ((lives < 1) && (!showedDeathBubble))
        {
            showedDeathBubble = YES;
            
            TutorialBubble* bubble = [[TutorialBubble alloc] initWithText:@"You lost all your lives! Normally, you'd be taken to a game over screen where you could submit your score to the highscore list, but we're a bit more forgiving in tutorial mode." name:@"gameover-rock"];
            self.currentTutorial = bubble;
            [bubble release];
        } else {
            TutorialBubble* bubble = [[TutorialBubble alloc] initWithText:@"As you play, Cart Collect gets progressively more intense. Watch what happens when rocks are added to the mix and the speed is turned up." name:@"intense"];
            self.currentTutorial = bubble;
            [bubble release];
        }
    } else if (item.sprite.tag == 2010)
    {
        TutorialBubble* bubble = [[TutorialBubble alloc] initWithText:@"As you play, Cart Collect gets progressively more intense. Watch what happens when rocks are added to the mix and the speed is turned up." name:@"intense"];
        self.currentTutorial = bubble;
        [bubble release];
    }
    
    if ((lives < 1) && (!showedDeathBubble))
    {
        showedDeathBubble = YES;
        
        TutorialBubble* bubble = [[TutorialBubble alloc] initWithText:@"You lost all your lives! Normally, you'd be taken to a game over screen where you could submit your score to the highscore list, but we're a bit more forgiving in tutorial mode." name:@"gameover"];
        self.currentTutorial = bubble;
        [bubble release];
    }
}

- (void)setCurrentTutorial:(TutorialBubble *)m_currentTutorial
{
    @synchronized(self)
    {
        if (currentTutorial != m_currentTutorial)
        {
            [currentTutorial removeFromSuperview];
            [currentTutorial release];
            currentTutorial = [m_currentTutorial retain];
        }
    }
    
    if (currentTutorial != nil)
    {
        [currentTutorial setTarget:self action:@selector(endTutorial)];
        [[[CCDirector sharedDirector] openGLView] addSubview:currentTutorial];
        [self pauseSchedulerAndActions];
    }
}

- (void)endTutorial
{
    [self resumeSchedulerAndActions];
    
    if ([currentTutorial.name isEqual:@"cart"])
    {
        [self scheduleDelayedAction:^{
            FallingObject* object = [self dropRandomItem];
            object.sprite.tag = 2000;
            [object release];
        } delay:3.0f];
    } else if ([currentTutorial.name isEqual:@"caught-first"])
    {
        [cart setImmobile:YES];
        
        [self scheduleDelayedAction:^{
            FallingObject* object = [self dropRandomItem];
            
            if (cart.sprite.position.x > 240)
            {
                object.sprite.position = ccp(20, 360);
            } else {
                object.sprite.position = ccp(460, 360);
            }
            
            object.sprite.tag = 2001;
            
            [object release];
        } delay:1.0f];
    } else if ([currentTutorial.name isEqual:@"missed-first"])
    {
        [self scheduleDelayedAction:^{
            FallingObject* object = [self dropRandomItem];
            object.sprite.tag = 2002;
            [object release];
        } delay:1.0f];
    } else if (([currentTutorial.name isEqual:@"caught-second"]) || ([currentTutorial.name isEqual:@"missed-second"]))
    {
        [self scheduleDelayedAction:^{
            FallingObject* object = [self dropSpecificItem:[[OneUp alloc] init]];
            object.sprite.tag = 2003;
            [object release];
        } delay:2.0f];
    } else if ([currentTutorial.name isEqual:@"gameover-rock"])
    {
        [self scheduleDelayedAction:^{
            FallingObject* object = [self dropRandomItem];
            object.sprite.tag = 2010;
            [object release];
        } delay:1.0f];
    } else if ([currentTutorial.name isEqual:@"intense"])
    {
        [self schedule:@selector(randomlyAddObject:) interval:1.0f];
    } else if ([currentTutorial.name isEqual:@"end"])
    {
        [[CCDirector sharedDirector] replaceScene:[CCTransitionFade transitionWithDuration:3.0f scene:[GameModeSelectionLayer scene] withColor:ccc3(0,0,0)]];
    }
    
    self.currentTutorial = nil;
}

- (void)pause
{
    if (self.currentTutorial != nil)
    {
        [self.currentTutorial removeFromSuperview];
    }
    
    [super pause];
}

- (void)unpause
{
    [super unpause];
    
    if (self.currentTutorial != nil)
    {
        [self pauseSchedulerAndActions];
        [[[CCDirector sharedDirector] openGLView] addSubview:self.currentTutorial];
    }
}

- (FallingObject*)dropSpecificItem:(FallingObject*)object
{
    int objectX = arc4random()%448+16;
	object.sprite.position = ccp(objectX, 360);
	object.sprite.scale = 1;
	[self addChild:object.sprite];
    
    object.delegate = self;
	
	[objects addObject:object];
    
    return object;
}

- (FallingObject*)dropRandomItem
{
    FallingObject* object;
    int randomval = arc4random()%100;
    
    if (randomval < 65)
    {
        object = [[Cherry alloc] init];
    } else {
        object = [[Bottle alloc] init];
    }
    
    return [self dropSpecificItem:object];
}

- (void)randomlyAddObject:(ccTime)dt
{
	FallingObject* object;
    
	if (randomItemsDropped < 5)
	{
		int randomval = arc4random()%100;
		
		if (randomval < 65)
		{
			object = [[Cherry alloc] init];
		} else if (randomval < 98)
		{
			object = [[Bottle alloc] init];
		} else {
			object = [[OneUp alloc] init];
		}
    } else if (randomItemsDropped == 5)
    {
        object = [[Rock alloc] init];
        object.sprite.tag = 2009;
        
        [self unschedule:@selector(randomlyAddObject:)];
	} else if (randomItemsDropped < 15) {
		int randomval = arc4random()%100;
		
		if (randomval < 40)
		{
			object = [[Cherry alloc] init];
		} else if (randomval < 70)
		{
			object = [[Rock alloc] init];
		} else if (randomval < 98)
		{
			object = [[Bottle alloc] init];
		} else {
			object = [[OneUp alloc] init];
		}
	} else if (randomItemsDropped == 15)
    {
        [self scheduleDelayedAction:^{
            TutorialBubble* bubble = [[TutorialBubble alloc] initWithText:@"That's pretty much it! You've completed the tutorial, so now it's time to play an actual game of Cart Collect!" name:@"end"];
            self.currentTutorial = bubble;
            [bubble release];
        } delay:2.0f];
        
        [self unschedule:@selector(randomlyAddObject:)];
        
        NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
        [defaults setBool:YES forKey:@"hasDoneTutorial"];
        
        return;
    } else {
        NSLog(@"randomItemsDropped in TutorialMode is greater than 15--this should never happen.");
        
        return;
    }
    
    [self dropSpecificItem:object];
    [object release];
    
    randomItemsDropped++;
}

@end