from fastapi import FastAPI, Request, Form
from fastapi.templating import Jinja2Templates
from fastapi.staticfiles import StaticFiles
from datetime import datetime

app = FastAPI()

app.mount("/static", StaticFiles(directory="static"), name="static")
templates = Jinja2Templates(directory="templates")

earthquakes_db = {
    1: {"id": 1, "date": "2011-03-11", "name": "Tohoku Japan", "magnitude": 9.1},
    2: {"id": 2, "date": "2010-02-27", "name": "Chile Maule", "magnitude": 8.8},
    3: {"id": 3, "date": "2015-04-25", "name": "Nepal Gorkha", "magnitude": 7.8}
}

next_id = 4


def get_all_earthquakes():
    """Get all earthquake records from database"""
    return list(earthquakes_db.values())


def get_earthquake_by_id(earthquake_id):
    """Get a single earthquake by ID"""
    return earthquakes_db.get(earthquake_id)


def create_earthquake(date, name, magnitude):
    """Insert a new earthquake record"""
    global next_id
    new_earthquake = {
        "id": next_id,
        "date": date,
        "name": name,
        "magnitude": magnitude
    }
    earthquakes_db[next_id] = new_earthquake
    next_id += 1
    return new_earthquake


def update_earthquake(earthquake_id, date, name, magnitude):
    """Update an existing earthquake record"""
    if earthquake_id in earthquakes_db:
        earthquakes_db[earthquake_id] = {
            "id": earthquake_id,
            "date": date,
            "name": name,
            "magnitude": magnitude
        }
        return earthquakes_db[earthquake_id]
    return None


def delete_earthquake(earthquake_id):
    """Delete an earthquake record"""
    if earthquake_id in earthquakes_db:
        deleted = earthquakes_db.pop(earthquake_id)
        return deleted
    return None


@app.get("/")
def index(request: Request):
    """Display main page with all records"""
    earthquakes = get_all_earthquakes()
    return templates.TemplateResponse("index.html", {
        "request": request,
        "earthquakes": earthquakes,
        "editing": None
    })


@app.post("/create")
def create(request: Request, date: str = Form(), name: str = Form(), magnitude: float = Form()):
    """REST API: Create new earthquake record"""
    create_earthquake(date, name, magnitude)
    earthquakes = get_all_earthquakes()
    return templates.TemplateResponse("index.html", {
        "request": request,
        "earthquakes": earthquakes,
        "editing": None,
        "message": "Record created successfully!"
    })


@app.get("/edit/{earthquake_id}")
def edit(request: Request, earthquake_id: int):
    """Show edit form for earthquake"""
    earthquakes = get_all_earthquakes()
    editing = get_earthquake_by_id(earthquake_id)
    return templates.TemplateResponse("index.html", {
        "request": request,
        "earthquakes": earthquakes,
        "editing": editing
    })


@app.post("/update/{earthquake_id}")
def update(request: Request, earthquake_id: int, date: str = Form(), name: str = Form(), magnitude: float = Form()):
    """REST API: Update earthquake record"""
    update_earthquake(earthquake_id, date, name, magnitude)
    earthquakes = get_all_earthquakes()
    return templates.TemplateResponse("index.html", {
        "request": request,
        "earthquakes": earthquakes,
        "editing": None,
        "message": "Record updated successfully!"
    })


@app.post("/delete/{earthquake_id}")
def delete(request: Request, earthquake_id: int):
    """REST API: Delete earthquake record"""
    delete_earthquake(earthquake_id)
    earthquakes = get_all_earthquakes()
    return templates.TemplateResponse("index.html", {
        "request": request,
        "earthquakes": earthquakes,
        "editing": None,
        "message": "Record deleted successfully!"
    })