#!/usr/bin/env node

const axios = require('axios');
const cheerio = require('cheerio');

const NYS_HEALTH_URL =
  'https://health.ny.gov/statistics/diseases/communicable/2019-nCoV/new_york_state_positive_cases_by_county.htm';

interface CountyData {
  name: string;
  cases: number;
}

async function getCountyData(): Promise<CountyData[]> {
  console.log('Fetching COVID-19 data from NYS Health Department...');
  try {
    const { data } = await axios.get(NYS_HEALTH_URL, {
      headers: {
        'User-Agent':
          'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
        Accept:
          'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Accept-Language': 'en-US,en;q=0.5',
        Connection: 'keep-alive',
      },
    });
    console.log('Data fetched successfully!');
    const $ = cheerio.load(data);
    const countyData: CountyData[] = [];

    $('table#case_count_table tbody tr').each((i: number, elem: any) => {
      const countyName = $(elem).find('td:first-child').text().trim();
      const casesText = $(elem).find('td:last-child').text().trim();
      const cases = parseInt(casesText.replace(/,/g, ''), 10);

      if (countyName && !isNaN(cases)) {
        countyData.push({ name: countyName, cases });
      }
    });

    return countyData;
  } catch (error) {
    console.error('Failed to fetch data:', error);
    throw error;
  }
}

async function main() {
  try {
    const countyData = await getCountyData();

    console.log('\nCOVID-19 Cases by County in New York State:');
    console.log('===========================================');

    countyData.forEach((county) => {
      console.log(`${county.name}: ${county.cases.toLocaleString()} cases`);
    });

    const totalCases = countyData.reduce(
      (sum, county) => sum + county.cases,
      0
    );
    console.log(
      `\nTotal cases across all counties: ${totalCases.toLocaleString()}`
    );
  } catch (error) {
    console.error('An error occurred:', error);
  }
}

main();
