import { readFileSync } from "fs";

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)}`)
})();