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

#define DEFAULT_CAPACITY 4

void stack_init(stack *s)
{
    s->top = -1;
    s->capacity = DEFAULT_CAPACITY;
    s->data = malloc(sizeof(int) * DEFAULT_CAPACITY);
}

void stack_destroy(stack *s){
    free(s->data);
    s->data = NULL;
    s->capacity = -1;
    s->top = -1;
}

void stack_pop(stack *s, int *value){
	if (stack_is_empty(*s)) {
		return;
	}	
	if (s->top == s->capacity/4){
		s->capacity /= 2;
		s->data = realloc(s->data, sizeof(int)*s->capacity);
	}

	*value = s->data[s->top];
	s->top -= 1;
}

void stack_peek(stack s, int *value){
    if (!stack_is_empty(s)) {
        *value = s.data[s.top];
    }
}

void stack_print(const stack s) {
	//TODO: replace if statement with following as soon as relevant function is implemented
	//if (!stack_is_empty()) {
	if (s.top >= 0) {
		printf("          TOP\n--------------------\n");
		for (int* spot = s.data + s.top; spot >= s.data; --spot) {
			printf("%8d |  %12d\n", spot - s.data, *spot);
		}
		printf("--------------------\n          BOTTOM\n");
	} else {
		printf("STACK EMPTY\n");
	}
}

void stack_clone(stack s, stack *clone) {
    clone->top = s.top;
    clone->capacity = s.capacity;
    clone->data = malloc(sizeof(int) * s.capacity);
    for (int i = 0; i <= s.top && i < s.capacity; i++) {
        clone->data[i] = s.data[i];
    }
}

int get_length(stack s)
{
    return s.top + 1;
}