#include <stdlib.h>
#include <stdio.h>
#include "checkit.h"

typedef struct {
    char title[31];
    int duration; /* in minutes */
    char rating; /* G, P, 3, R */
} Movie;

void useMallocBuiltin(void)
{
    double* number;
    number = (double *)malloc(sizeof (double));
    *number = 56.3;
    *number = *number * 2;
    checkit_double(112.6, *number);
    free(number);
}

void useMallocStruct(void)
{
    Movie* one;
    Movie* two;
    Movie* summerBlockbuster;
    one = (Movie *)malloc(sizeof (Movie));
    strcpy(one->title, "Judo Kitten");
    one->duration = 118;
    one->rating = 'P';
    checkit_string("Judo Kitten", one->title);
    checkit_int(118, one->duration);
    checkit_char('P', one->rating);

    two = (Movie *)malloc(sizeof (Movie));
    strcpy(two->title, "Trucks 2");
    two->duration = 97;
    two->rating = 'G';
    checkit_string("Trucks 2", two->title);
    checkit_int(97, two->duration);
    checkit_char('G', two->rating);

    summerBlockbuster = one;
    checkit_string("Judo Kitten", summerBlockbuster->title);
    checkit_int(118, summerBlockbuster->duration);
    checkit_char('P', summerBlockbuster->rating);

    summerBlockbuster = two;
    checkit_string("Trucks 2", summerBlockbuster->title);
    checkit_int(97, summerBlockbuster->duration);
    checkit_char('G', summerBlockbuster->rating);

    free(one);
    free(two);
}

int getIndexOfLargest(int* a, int size)
{
    int i, largest = 0;
    for(i = 1; i < size; i++) {
        if(a[i] > a[largest]) {
            largest = i;
        }
    }
    return largest;
}

void useCallocBuiltin(void)
{
    int* tacosEatenByDay;
    int numDays, i;

    printf("How many days will you track the number of tacos eaten? ");
    scanf("%d", &numDays);
    tacosEatenByDay = (int *)calloc(numDays, sizeof(int));
    for(i = 0; i < numDays; i++) {
        printf("How many tacos eaten on day %d? ", i + 1);
        scanf("%d", &tacosEatenByDay[i]);
    }
    printf("You ate the most tacos on day %d.\n", 
            getIndexOfLargest(tacosEatenByDay, numDays) + 1);

    free(tacosEatenByDay);
}

int getIndexOfLongest(Movie* a, int size)
{
    int i, longest = 0;
    for(i = 1; i < size; i++) {
        if(a[i].duration > a[longest].duration) {
            longest = i;
        }
    }
    return longest; 
}

void useCallocStruct(void)
{
    Movie* movies;
    Movie* longestMovie;
    int numMovies, index, i;

    printf("How many movies will be released this summer? ");
    scanf("%d", &numMovies);
    movies = (Movie *)calloc(numMovies, sizeof(Movie));
    for(i = 0; i < numMovies; i++) {
        printf("Enter the title, duration, and rating of a movie\n");
        scanf("%s", movies[i].title); 
        scanf("%d", &movies[i].duration);
        scanf(" %c", &movies[i].rating);
    }
    index = getIndexOfLongest(movies, numMovies); 
    printf("The longest movie of the summer is:\n%s\n", movies[index].title);

    longestMovie = &movies[index];
    printf("The longest movie of the summer is:\n%s\n", longestMovie->title);

    free(movies);
}

int main(void)
{
    useMallocBuiltin();
    useMallocStruct();
    useCallocBuiltin();
    useCallocStruct();
    return 0;
}