//
//  main.m
//  PlayerAndGame
//
//  Created by User on 4/06/2014.
//  Copyright (c) 2014 RJM Programming. All rights reserved.
//

// Thanks to Objective-C by Steven Holzner (for code ideas)

#import <stdlib.h>
#import <stdio.h>
#import <Foundation/Foundation.h>

@interface Player: NSObject {
@private
    char privatename[31];
@public
    char publicname[31];
@protected
    char protectedname[31];
}
-(void) print;
-(char *) getName;
-(char *) getNamePrivate;
-(void) setName:  (char *) iname;
@end

@implementation Player
-(Player*) init: (char *) inname {
    self = [super init];
    if (self) {
        [self setName: inname];
    }
    return self;
}
-(char *) getName {
    return publicname;
}
-(char *) getNamePrivate {
    return privatename;
}
-(void) setName: (char *) iname {
    strcpy(protectedname, iname);
    strcpy(privatename, iname);
    strcpy(publicname, iname);
}

-(void) print {
    printf("Welcome to the game, %s.\n", privatename);
}
@end


@interface Game: NSObject {
@private
    Player *player1;
    Player *player2;
@public
    int score1;
    int score2;
    int goes;
}
-(void) print;
-(void) makeAMove;
-(void) setPlayer1: (Player *) inplayer1;
-(void) setPlayer2: (Player *) inplayer2;
-(char *) getWinner;
-(int) getScore1;
-(int) getScore2;
-(void) setScore1: (int) inscore1;
-(void) setScore2: (int) inscore2;
-(void) play;
@end

@implementation Game
-(Game*) init: (Player *) inplay1 :(Player *) inplay2 {
    self = [super init];
    if (self) {
        [self setPlayer1: inplay1];
        [self setPlayer2: inplay2];
        [self setScore1: 0];
        [self setScore2: 0];
        self->goes = 0;
    }
    return self;
}

-(void) makeAMove {
    int r = arc4random() % 12;
    if ((self->goes % 2) == 1) {
        r += [self getScore1];
        [self setScore1 :r];
    } else {
        r += [self getScore2];
        [self setScore2 :r];
    }
    self->goes++;
}

-(void) setPlayer1: (Player *) inplayer1 {
    player1 = inplayer1;
}

-(void) setPlayer2: (Player *) inplayer2 {
    player2 = inplayer2;
}

-(char *) getWinner {
    if ([self getScore2] > [self getScore1] ) {
        return [player2 getName];
    } else {
        return [player1 getName];
    }
}

-(int) getScore1 {
    return score1;
}

-(int) getScore2 {
    return score2;
}

-(void) setScore1: (int) inscore1 {
    score1 = inscore1;
}

-(void) setScore2: (int) inscore2 {
    score2 = inscore2;
}

-(void) play {
    for (int i=0; i<10; i++) [self makeAMove];
}

-(void) print {
    printf("Welcome to The game between %s and %s ... the score is %d vs %d ... so %s is the current winner/leader.\n", [player1 getName], [player2 getName], [self getScore1], [self getScore2], [self getWinner]);
}
@end



int main(int argc, const char * argv[]) {
    @autoreleasepool {
        id pid;
        Player *p1 = [[Player new] init: "Eric"];
        
        if ( [p1 isKindOfClass: [NSObject class]] == YES ) {
            pid = p1;
            printf("p1 for %s is an NSObject.\n", [pid getName]);
            [p1 print];
            [pid print];
        }
        Player *p2 = [Player new];
        
        if ( [p2 isKindOfClass: [NSObject class]] == YES ) {
            pid = p2;
            printf("p2 for %s is an NSObject.\n", [pid getName]);
            [p2 print];
            [pid print];
            char *xname = "Idle\0";
            [p2 setName :xname];
            printf("p2 for %s is NSObject.\n", p2->publicname);
            printf("p2 For %s is NSObject.\n", [p2 getNamePrivate]);
            [p2 print];
            [pid print];
        }
        Game *g1 = [[Game new] init: p1 :p2];
        
        if ( [g1 isKindOfClass: [NSObject class]] == YES ) {
            printf("g1 is an NSObject.\n");
            [g1 print];
            [g1 play];
            [g1 print];
        }
    }
    return 0;
}

