import { readFileSync } from "fs";

const time = Date.now();
const input = readFileSync('day 4/input.txt').toString().split('\n');

interface Card {
    id: number,
    winningNums: number[],
    cardNums: number[]
}

const cards: Card[] = [];

for (const line of input) {
    const id: number = parseInt(line.match(/Card\s+(\d+)/)![1])
    const withoutCardId = line.split(': ')[1]
    const unformattedWinNums = withoutCardId.split('|')[0].trim().replace(/\s+/g, ' ');
    const unformattedCardNums = withoutCardId.split('|')[1].trim().replace(/\s+/g, ' ');
    const winningNums = unformattedWinNums.split(' ').map(i => parseInt(i));
    const cardNums = unformattedCardNums.split(' ').map(i => parseInt(i));

    cards.push({
        id,
        winningNums,
        cardNums
    })
}

const findMatches = (card: Card): number[] => {
    const matches: number[] = []
    card.cardNums.forEach(num => {
        card.winningNums.includes(num) ? matches.push(num) : void 0;
    })

    return matches
}

// Part 1
(() => {
    let sum = 0;
    for(const card of cards) {
    
        const matches = findMatches(card);
        if(!(matches.length > 0)) continue;
        let mult: number = 0;
        matches.forEach((i, idx) => {
            idx === 0 ? mult = 1 : mult *= 2
        })
    
        sum += mult ?? 0
        
    }
    console.log(`(Part 1) Points: ${sum}`)
})();

// Part 2

interface newCard extends Card {
    copies: number
}

(() => {
    const newCards: newCard[] = cards.map(card => {
        return {...card, copies: 1}
    });

    for(let i = 0; i < newCards.length; i++) {
        const card = newCards[i]
        const matchCount = findMatches(card).length;
        for(let j = matchCount; j > 0; j--) {
            newCards[i+j].copies += (1 * card.copies);
        }

    }

    console.log(`(Part 2) Total Scratchcards: ${newCards.reduce((acc, curr) => {
        return acc + curr.copies;
      }, 0)}`)
})();


console.log(`Total Time (In millis): ${Date.now() - time}`)
