// Compara las llamadas de cada versión y prueba el ordenamiento. No se cambia.
#include <stdio.h>
#include <stdlib.h>

#include "counted.h"
#include "merge_sort.h"

#define SEARCH_SIZE 10000

static void compare_power(long long base, int n) {
    long slow_calls = 0;
    long fast_calls = 0;
    long long slow = power_slow(base, n, &slow_calls);
    long long fast = power_fast(base, n, &fast_calls);

    printf("power(%lld, %d): lenta %lld con %ld llamadas, rápida %lld con %ld llamadas\n",
           base, n, slow, slow_calls, fast, fast_calls);
}

static void compare_search(const int *a, size_t n, int value) {
    long linear_calls = 0;
    long binary_calls = 0;
    long linear = linear_search(a, n, value, &linear_calls);
    long binary = binary_search(a, n, value, &binary_calls);

    printf("buscar %d en %zu: lineal da %ld con %ld llamadas, binaria da %ld con %ld llamadas\n",
           value, n, linear, linear_calls, binary, binary_calls);
}

static void print_array(const int *a, size_t n) {
    for (size_t i = 0; i < n; i++) {
        printf("%d ", a[i]);
    }
    printf("\n");
}

int main(void) {
    compare_power(2, 10);
    compare_power(2, 62);
    compare_power(1, 1024);

    int *evens = malloc(SEARCH_SIZE * sizeof *evens);
    if (evens == NULL) {
        fprintf(stderr, "no hay memoria\n");
        return 1;
    }
    for (int i = 0; i < SEARCH_SIZE; i++) {
        evens[i] = 2 * i;
    }
    compare_search(evens, SEARCH_SIZE, 19998);
    compare_search(evens, SEARCH_SIZE, 7);
    free(evens);

    int data[] = {31, 18, 25, 9, 22, 7, 14};
    size_t data_n = sizeof data / sizeof data[0];
    print_array(data, data_n);
    if (!merge_sort(data, data_n)) {
        fprintf(stderr, "merge_sort devolvió 0: falta memoria, o todavía no está escrita\n");
        return 1;
    }
    print_array(data, data_n);
    return 0;
}
