from flask import Flask, request, jsonify
from flask_cors import CORS
from db import get_conn
import os
app = Flask(__name__)
CORS(app)  # fine for dev, tighten in prod

# Helper: turn SELECT rows into dicts

def rows_to_dicts(cursor):
    cols = [c[0] for c in cursor.description]
    return [dict(zip(cols, row)) for row in cursor.fetchall()]
@app.route('/')
def hello_world():  # put application's code here
    return 'Hello World!'

@app.get("/api/health")
def health():
    return {"ok": True}

@app.get("/api/pets")
def list_pets():
    conn = get_conn()
    try:
        cur = conn.cursor()
        cur.execute("SELECT * FROM PetDetails ORDER BY pet_id DESC")
        return jsonify(rows_to_dicts(cur))
    finally:
        conn.close()

@app.get("/api/pets/<int:pet_id>")
def get_pet(pet_id):
    conn = get_conn()
    try:
        cur = conn.cursor()
        cur.execute("SELECT * FROM PetDetails WHERE pet_id=%s", (pet_id,))
        rows = rows_to_dicts(cur)
        return jsonify(rows[0]) if rows else ({"error": "not found"}, 404)
    finally:
        conn.close()

@app.post("/api/pets")
def create_pet():
    data = request.get_json(force=True) or {}
    if "pet_name" not in data:
        return {"error": "pet_name required"}, 400

    fields = [
        "pet_name","date_of_birth","date_of_death","cause_of_death","gender",
        "species","breed","microchipped","microchip_vendor","microchip_number"
    ]
    values = [data.get(f) for f in fields]
    conn = get_conn()
    try:
        cur = conn.cursor()
        placeholders = ",".join(["%s"] * len(fields))
        cur.execute(f"INSERT INTO PetDetails ({','.join(fields)}) VALUES ({placeholders})", tuple(values))
        conn.commit()
        return {"pet_id": cur.lastrowid}, 201
    finally:
        conn.close()

@app.put("/api/pets/<int:pet_id>")
def update_pet(pet_id):
    data = request.get_json(force=True) or {}
    allowed = [
        "pet_name","date_of_birth","date_of_death","cause_of_death","gender",
        "species","breed","microchipped","microchip_vendor","microchip_number"
    ]
    fields = [f"{k}=%s" for k in data if k in allowed]
    if not fields:
        return {"error": "nothing to update"}, 400

    values = [data[k] for k in data if k in allowed]
    values.append(pet_id)

    conn = get_conn()
    try:
        cur = conn.cursor()
        cur.execute(f"UPDATE PetDetails SET {', '.join(fields)} WHERE pet_id=%s", tuple(values))
        conn.commit()
        return {"ok": True}
    finally:
        conn.close()

@app.delete("/api/pets/<int:pet_id>")
def delete_pet(pet_id):
    conn = get_conn()
    try:
        cur = conn.cursor()
        cur.execute("DELETE FROM PetDetails WHERE pet_id=%s", (pet_id,))
        conn.commit()
        return {"ok": True}
    finally:
        conn.close()


if __name__ == '__main__':
    #app.run()
    port = int(os.getenv("FLASK_PORT", 8101))
    # using 0.0.0.0 to make the server available externally (lets Flask accept requests
    # from other machines, not just from localhost
    app.run(host="0.0.0.0", port=8101, debug=True)
