import time
import json
import psycopg2
import psycopg2.extensions
from psycopg2.extras import Json
import re
import pandas as pd
import requests
import xmltodict
import datetime
from tabulate import tabulate

allobs = []

states = ['wv', 'oh', 'va', 'ky']
ohcounties = ['-LW-', '-GL-', '-JC-', '-MS-', '-AT-', '-PY-', '-WS-', '-MG-', '-VN-']
vacounties = ['-DC-', '-BC-']
kycounties = ['-LR-', '-CT-', '-GP-', '-BD-']
datewanted = datetime.date.today().strftime("%m/%d/%Y")

try:
    for state in states:
        url = f'https://data.cocorahs.org/export/exportreports.aspx?state={state}&Format=XML&Date={datewanted}&responsefields=all'
        response = requests.get(url)
        response.raise_for_status()  # Check for HTTP errors
        data = xmltodict.parse(response.content.decode('utf-8'))  # Explicitly decode as UTF-8
        
        try:
            reports = data['Cocorahs']['DailyPrecipReports']['DailyPrecipReport']
            # Handle case where reports might be a single dict or a list
            if isinstance(reports, dict):
                reports = [reports]
                
            for report in reports:
                if state == 'wv':
                    allobs.append(report)
                else:
                    for county in eval(state + 'counties'):
                        if county in report['StationNumber']:
                            allobs.append(report)
        except (KeyError, TypeError) as e:
            print(f"Error processing data for state {state}: {e}")
            continue

    # Process observations
    finalobs = []
    for obs in allobs:
        tempob = [
            obs.get('DateTimeStamp', ''),
            obs.get('StationNumber', ''),
            obs.get('StationName', ''),
            obs.get('TotalPrecipAmt', ''),
            obs.get('NewSnowDepth', ''),
            obs.get('TotalSnowDepth', ''),
            obs.get('Notes', '')
        ]
        finalobs.append(tempob)

    # Write to file with UTF-8 encoding
    with open('/var/www/html/work/today.txt', 'w', encoding='utf-8') as f:
        f.write(tabulate(
            finalobs,
            headers=["Date/Time of Ob (Z)", "Station Number", "Station Name", 
                    "New Precip", "New Snow", "Snow Depth", "Comments"],
            tablefmt='plain'  # Changed to 'plain' for simpler text output
        ))

except requests.RequestException as e:
    print(f"Error fetching data: {e}")
except Exception as e:
    print(f"Unexpected error: {e}")