"""
Site Grid — ortak yapılandırma.

Ne Yetişir? motorunun iklim girdisini canlı API yerine statik ızgaradan
beslemek için kullanılan betiklerin tek ayar noktası.

TASARIM KARARI — NEDEN SAATLİK VERİ İNDİRMİYORUZ
------------------------------------------------
Motor iklimden yalnız 4 şey okuyor (ölçüldü, bkz. docs/SITE-GRID-XRAY.md §2.1):
    tavg[12]  aylık ortalama sıcaklık
    tmin[12]  aylık ortalama GÜNLÜK MİNİMUM sıcaklık
    prec[12]  aylık toplam yağış
    absMin    kayıttaki en düşük günlük minimum

Bunları en az veriyle üretmek için İKİ FARKLI CDS ürünü kullanılır:

1) reanalysis-era5-land-monthly-means  (monthly_averaged_reanalysis)
   -> tavg[12] ve prec[12]
   Aylık ortalama, saatlik değerlerin ortalamasıdır; günlük üründen hesaplamakla
   MATEMATİKSEL OLARAK AYNI sonucu verir ama ~30 kat küçüktür.
   DİKKAT: total_precipitation bu üründe "m/GÜN" birimindedir (ayın toplamı
   DEĞİL). Aylık toplam = deger * 1000 * o_ayin_gun_sayisi  (mm).

2) derived-era5-land-daily-statistics  (daily_statistic=daily_minimum)
   -> tmin[12] ve absMin
   BU ÜRÜN ZORUNLUDUR ve aylık ürünle ikame EDİLEMEZ:
     - Aylık ürün 2m_temperature için saatlik değerlerin ortalamasını verir.
       Bizim istediğimiz "günlük minimumların aylık ortalaması" AYRI bir
       istatistiktir ve aylık üründe yoktur.
     - absMin (kayıttaki tek bir en düşük gün) aylık ortalamadan hiçbir şekilde
       türetilemez; günlük çözünürlük şarttır.
   Saatlik ürün yerine "günlük istatistik" ürünü kullanmak aynı bilgiyi
   ~24 kat daha az veriyle verir.

Toplam kazanç: saatlik indirmeye göre ~22x daha küçük (bkz. README).
"""

from __future__ import annotations

import os
from dataclasses import dataclass
from pathlib import Path

# --------------------------------------------------------------------------
# Yollar
# --------------------------------------------------------------------------
ROOT = Path(__file__).resolve().parent
RAW_DIR = ROOT / "raw"      # CDS'ten inen ham NetCDF (git'e girmez)
OUT_DIR = ROOT / "out"      # üretilen ızgara tabloları (git'e girmez)


@dataclass(frozen=True)
class BBox:
    """CDS `area` sırası: [Kuzey, Batı, Güney, Doğu]."""
    name: str
    north: float
    west: float
    south: float
    east: float

    def as_cds_area(self) -> list[float]:
        return [self.north, self.west, self.south, self.east]

    def cell_count(self, step: float = 0.1) -> int:
        lat_n = round((self.north - self.south) / step) + 1
        lng_n = round((self.east - self.west) / step) + 1
        return lat_n * lng_n


# PİLOT — İç Anadolu koridoru.
# Neden sadece Ankara değil: eşdeğerlik kapısı mevcut Open-Meteo önbellek
# noktalarıyla karşılaştırma yapıyor. Dar Ankara kutusunda önbellekte YALNIZ
# 4 nokta var (ölçüldü 2026-09-04); bu kutu 7'ye çıkarıyor ve hâlâ küçük.
PILOT_BBOX = BBox(name="ic-anadolu-pilot", north=41.0, west=30.0, south=38.0, east=35.0)

# TÜM TÜRKİYE — ONAY OLMADAN KULLANILMAZ (01_download_era5.py --full --onayliyorum)
TURKEY_BBOX = BBox(name="turkiye", north=42.5, west=25.5, south=35.5, east=45.0)

# --------------------------------------------------------------------------
# Dönem
# --------------------------------------------------------------------------
# WMO standart normal periyodu. Üretimde kullanılacak dönem budur.
NORMAL_START_YEAR = 1991
NORMAL_END_YEAR = 2020

# Eşdeğerlik kapısı için ALT DÖNEM. Mevcut motor Open-Meteo'dan 2015-2024
# penceresini kullanıyor; 1991-2020 ile doğrudan karşılaştırmak "sağlayıcı
# farkı" ile "dönem farkı"nı birbirine karıştırır. Bu alt dönem AYNI İNDİRMEDEN
# hesaplanır, EK İNDİRME GEREKTİRMEZ.
OVERLAP_START_YEAR = 2015
OVERLAP_END_YEAR = 2020

# Bilinen veri sorunu: ERA5-Land AYLIK ortalama ürününde 2022-09 ile 2024-02
# arasında yağışta 40 mm/ay'a varan tutarsızlık bildirildi. Üretim dönemimiz
# (1991-2020) bu aralığın DIŞINDA; dönem ileride uzatılırsa bu not dikkate alınır.
KNOWN_MONTHLY_ISSUE = ("2022-09", "2024-02")

# --------------------------------------------------------------------------
# CDS veri setleri
# --------------------------------------------------------------------------
DS_MONTHLY = "reanalysis-era5-land-monthly-means"
DS_DAILY = "derived-era5-land-daily-statistics"

GRID_STEP = 0.1  # ERA5-Land yerel çözünürlüğü; store.ts climate ızgarasıyla aynı

# Atıf — koda ve UI'a girmesi ZORUNLU (CC-BY 4.0).
COPERNICUS_ATTRIBUTION = (
    "Generated using Copernicus Climate Change Service information 2026"
)


def cds_key_present() -> bool:
    """CDS anahtarı var mı? Yoksa betikler indirmeye BAŞLAMAZ."""
    if os.environ.get("CDSAPI_KEY") and os.environ.get("CDSAPI_URL"):
        return True
    return (Path.home() / ".cdsapirc").exists()
