#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>

#include "../../lib/aoc.h"

int line_checksum_1(char *line) {
  char **saveptr = malloc(sizeof(char*));
  char *token = strtok_r(line, "\t", saveptr);

  int min = INT_MAX;
  int max = INT_MIN;

  while (token != NULL) {
    int value = atoi(token);
    if (value < min) min = value;
    if (value > max) max = value;
    token = strtok_r(NULL, "\t", saveptr);
  }

  free(saveptr);
  return max - min;
}

int line_checksum_2(char *line) {
  int tokens[20];

  char **saveptr = malloc(sizeof(char*));
  char *token = strtok_r(line, "\t", saveptr);
  int index = 0;

  while (token != NULL) {
    tokens[index++] = atoi(token);
    token = strtok_r(NULL, "\t", saveptr);
  }

  for (int i = 0; i < index; i++) {
    for (int j = 0; j < index; j++) {
      if (tokens[i] != tokens[j] && (tokens[i] % tokens[j] == 0)) {
	free(saveptr);
	return tokens[i] / tokens[j];
      }
    }
  }

  for (int i = 0; i < index; i++) {
    printf("%d ", tokens[i]);
  }
  printf("ERROR! No checksum found\n");

  return 0;
}

int main() {
  char *input = aoc_read_input();

  char **line_saveptr = malloc(sizeof(char*));
  char *line = strtok_r(input, "\n", line_saveptr);

  int checksum_sum_1 = 0;
  int checksum_sum_2 = 0;

  while (line != NULL) {
    char *line_copy = malloc(strlen(line) + 1);
    strcpy(line_copy, line);
    checksum_sum_1 += line_checksum_1(line);
    checksum_sum_2 += line_checksum_2(line_copy);
    line = strtok_r(NULL, "\n", line_saveptr);
    free(line_copy);
  }

  printf("Part 1: %d\n", checksum_sum_1);
  printf("Part 2: %d\n", checksum_sum_2);

  free(line_saveptr);
  free(line);
  free(input);
}