"""Serve a saved USGS snapshot; page visits never download new data."""
import csv
import json
import math
from pathlib import Path

from fastapi import APIRouter, HTTPException, Query
from fastapi.responses import FileResponse

BASE = Path(__file__).resolve().parent
SNAPSHOT = BASE / 'data' / 'earthquakes.csv'
router = APIRouter()
LABELS = ['Below 0', '0 to <1', '1 to <2', '2 to <3',
          '3 to <4', '4 to <5', '5 and above']


def summarize(rows, minimum):
    counts = [0] * len(LABELS)
    earthquakes = 0
    missing = 0
    for row in rows:
        if row['type'] != 'earthquake':
            continue
        earthquakes += 1
        try:
            magnitude = float(row['mag'])
        except (ValueError, TypeError):
            missing += 1
            continue
        if not math.isfinite(magnitude):
            missing += 1
            continue
        if magnitude < minimum:
            continue
        index = 0 if magnitude < 0 else min(int(magnitude) + 1, 6)
        counts[index] += 1
    return {'minimum': minimum, 'earthquakes': earthquakes,
            'missing_magnitudes': missing, 'selected': sum(counts),
            'labels': LABELS, 'counts': counts}


@router.get('/earthquakes')
def earthquakes(minimum: float = Query(default=2.5, ge=-2, le=10)):
    try:
        with SNAPSHOT.open(encoding='utf-8', newline='') as source:
            result = summarize(csv.DictReader(source), minimum)
        metadata = json.loads(SNAPSHOT.with_suffix('.csv.source.json').read_text())
    except (OSError, ValueError, KeyError, csv.Error):
        raise HTTPException(status_code=503,
                            detail='Snapshot unavailable. Run download_earthquakes.py, then retry.') from None
    result['source'] = metadata
    return result


@router.get('/', include_in_schema=False)
def dashboard():
    return FileResponse(BASE / 'dashboard.html')
