const text = await Deno.readTextFile("input.dat");

const lines = text.split("\n");

const passports = [];

for (let i = 0; i < lines.length; i++) {
  let passport = "";

  while (lines[i] != "") {
    passport += `${lines[i++]} `;
  }

  passports.push(passport);
}

const passportsFieldNames = passports.map((passport) => {
  return passport.split(" ").map((field) => field.split(":")[0]);
});

const passportsFields = passports.map((passport) => {
  const pass = {};
  passport
    .split(" ")
    .forEach((field) => (pass[field.split(":")[0]] = field.split(":")[1]));
  return pass;
});

function weakValidation(fieldNames) {
  const requiredFields = ["byr", "iyr", "eyr", "hgt", "hcl", "ecl", "pid"];
  return requiredFields.every((fieldName) => fieldNames.includes(fieldName));
}

function strongValidation(fields) {
  const rules = {
    byr: (year) => year >= 1920 && year <= 2002,
    iyr: (year) => year >= 2010 && year <= 2020,
    eyr: (year) => year >= 2020 && year <= 2030,
    hgt: (val) =>
      (/cm$/.test(val) &&
        Number(val.slice(0, -2)) >= 150 &&
        Number(val.slice(0, -2)) <= 193) ||
      (/in$/.test(val) &&
        Number(val.slice(0, -2)) >= 59 &&
        Number(val.slice(0, -2)) <= 76),
    hcl: (val) => /^#[0-9a-f]{6}$/.test(val),
    ecl: (val) =>
      ["amb", "blu", "brn", "gry", "grn", "hzl", "oth"].includes(val),
    pid: (val) => /^\d{9}$/.test(val),
  };

  return Object.entries(rules).every(([field, rule]) => {
    return rule(fields[field]);
  });
}

console.log(passportsFields.filter(weakValidation).length);
console.log(passportsFields.filter(strongValidation).length);