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

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

typedef struct Compartment {
  char contents[52];
} Compartment;

void print_compartment(Compartment *c) {
  for (char i = 'a'; i <= 'z'; i++) {
    printf("%c", i);
  }
  for (char i = 'A'; i <= 'Z'; i++) {
    printf("%c", i);
  }
  printf("\n");
  for (char i = 0; i < 52; i++) {
    printf("%d", c->contents[i]);
  }
  printf("\n\n");
}

Compartment fill_compartment(const char *half) {
  Compartment compartment;
  for (char i = 0; i < 52; i++) {
    compartment.contents[i] = 0;
  }

  for (int i = 0; i < strlen(half); i++) {
    char c = half[i];
    if (c >= 'a' && c <= 'z') {
      compartment.contents[c - 'a'] = 1;
    } else {
      compartment.contents[c - 'A' + 26] = 1;
    }
  }
  fflush(stdout);
  return compartment;
}

int priority(char *line) {
  int len = strlen(line);
  char *second = malloc((len / 2) + 1);
  strcpy(second, line + (len / 2));
  line[len / 2] = '\0';

  Compartment c1 = fill_compartment(line);
  Compartment c2 = fill_compartment(second);

  // print_compartment(&c1);
  // print_compartment(&c2);

  for (int i = 0; i < 52; i++) {
    if (c1.contents[i] && c2.contents[i]) {
      free(second);
      return i + 1;
    }
  }

  free(second);
  return 0;
}

int three_line_priority(char *one, char *two, char *three) {
  Compartment c1 = fill_compartment(one);
  Compartment c2 = fill_compartment(two);
  Compartment c3 = fill_compartment(three);

  for (int i = 0; i < 52; i++) {
    if (c1.contents[i] && c2.contents[i] && c3.contents[i]) {
      return i + 1;
    }
  }

  return 0;
}

int main() {
  char *line;

  int sum = 0;
  while ((line = aoc_read_line()) != NULL) {
    sum += priority(line);
  }

  aoc_reset_read_line();

  int three_line_sum = 0;
  char *line_1, *line_2, *line_3;
  while (
	 (line_1 = aoc_read_line()) != NULL &&
	 (line_2 = aoc_read_line()) != NULL &&
	 (line_3 = aoc_read_line()) != NULL
	 ) {
    three_line_sum += three_line_priority(line_1, line_2, line_3);
  }
  
  printf("Part 1: %d\n", sum);
  printf("Part 2: %d\n", three_line_sum);

  aoc_free();
  return 0;
}