from datetime import datetime
from database import get_connection, is_postgres

class Destinations:
    def __init__(self):
        # Parameter style: Postgres uses %s, SQLite uses ?
        self.ph = "%s" if is_postgres() else "?"

    def destination_to_dict(self, row):
        destination = {
                "id": row[0],
                "user_id": row[1],
                "name": row[2],
                "address": row[3],
                "latitude": row[4],
                "longitude": row[5],
                "created_at": row[6]
            }
        return destination
        
    def create(self, user_id, name, address):
        created_at = datetime.now().isoformat()
        with get_connection() as conn:
            cur = conn.cursor()
            cur.execute(
                f"""
                INSERT INTO destinations (user_id, name, address, created_at)
                VALUES ({self.ph}, {self.ph}, {self.ph}, {self.ph})
                """,
                (user_id, name, address, created_at),
            )
            if hasattr(conn, "commit"):
                conn.commit()
            return cur.lastrowid if hasattr(cur, "lastrowid") else None

    def update(self, id, user_id, name, address):
        with get_connection() as conn:
            cur = conn.cursor()
            cur.execute(
                f"""
                UPDATE destinations
                SET user_id = {self.ph}, name = {self.ph}, address = {self.ph}
                WHERE id = {self.ph}
                """,
                (user_id, name, address, id),
            )
            if hasattr(conn, "commit"):
                conn.commit()

    def add_gps_coordinates(self, id, latitude, longitude):
        with get_connection() as conn:
            cur = conn.cursor()
            cur.execute(
                f"""
                UPDATE destinations
                SET latitude = {self.ph}, longitude = {self.ph}
                WHERE id = {self.ph}
                """,
                (latitude, longitude, id),
            )
            if hasattr(conn, "commit"):
                conn.commit()

    def delete(self, id):
        with get_connection() as conn:
            cur = conn.cursor()
            cur.execute(
                f"DELETE FROM destinations WHERE id = {self.ph}",
                (id,),
            )
            if hasattr(conn, "commit"):
                conn.commit()

    def get_all_by_user(self, user_id):
        with get_connection() as conn:
            cur = conn.cursor()
            cur.execute(
                f"SELECT * FROM destinations WHERE user_id = {self.ph} ORDER BY created_at DESC",
                (user_id,),
            )
            rows = cur.fetchall()
        return [self.destination_to_dict(row) for row in rows]

    def get_by_id(self, id):
        with get_connection() as conn:
            cur = conn.cursor()
            cur.execute(
                f"SELECT * FROM destinations WHERE id = {self.ph}",
                (id,),
            )
            row = cur.fetchone()
        return self.destination_to_dict(row) if row else None