from datetime import datetime, timedelta
from zoneinfo import ZoneInfo

from astral import Observer
from astral.sun import sun

from database import db
from models.sunrise_walk_config import SunriseWalkConfig

LATITUDE = -22.902528365649843
LONGITUDE = -43.559773079601726
TIMEZONE = ZoneInfo("America/Sao_Paulo")

_OBSERVER = Observer(latitude=LATITUDE, longitude=LONGITUDE)


def get_config():
    """Retorna a linha única de config, criando-a com o default se ainda não existir."""
    config = SunriseWalkConfig.query.first()
    if config is None:
        config = SunriseWalkConfig(offset_minutes=-15)
        db.session.add(config)
        db.session.commit()
    return config


def update_offset_minutes(value):
    config = get_config()
    config.offset_minutes = value
    db.session.commit()
    return config


def calculate_times(offset_minutes):
    """Retorna (sunrise, departure) para hoje, timezone-aware em America/Sao_Paulo.

    A data usada é a de hoje no timezone fixo da localização, não a do
    servidor (que pode rodar em UTC), para não pegar o dia errado perto da
    meia-noite.
    """
    today = datetime.now(TIMEZONE).date()
    sun_times = sun(_OBSERVER, date=today, tzinfo=TIMEZONE)
    sunrise = sun_times["sunrise"]
    departure = sunrise + timedelta(minutes=offset_minutes)
    return sunrise, departure
