import machine
import os
import time
import network

# ============================================================
# SD KART
# ============================================================
LDO_CHANNEL = 4  # Sende calisan deger (32GB SanDisk ile dogrulandi)

def sd_mount():
    try:
        os.umount("/sd")
    except Exception:
        pass
    sd = machine.SDCard(slot=0, width=1, ldo=LDO_CHANNEL)
    os.mount(sd, "/sd")
    print("SD kart baglandi.")
    return sd

def log_data(text):
    with open("/sd/deneme.txt", "a") as f:
        f.write(text + "\n")


# ============================================================
# ETHERNET (RMII - IP101GRI)
# Pin kaynagi: Waveshare resmi wiki - ESP32-P4-WIFI6-POE-ETH
# ============================================================
_eth = None

def connect_ethernet(timeout_s=10):
    """RJ45/PoE Ethernet baglantisini baslatir. Basariliysa network.LAN nesnesini dondurur."""
    global _eth
    if _eth is None:
        _eth = network.LAN(
            id=0,
            mdc=machine.Pin(31),
            mdio=machine.Pin(52),
            power=machine.Pin(51),          # RESET hattı (aktif reset kontrolü)
            phy_type=network.PHY_IP101,
            phy_addr=1,                      # Calismazsa 0, 2 vb. dene
            ref_clk=machine.Pin(50),
            ref_clk_mode=machine.Pin.IN,     # REF_CLK PHY'den geliyor (input)
        )

    _eth.active(True)

    print("Ethernet linki bekleniyor...")
    t0 = time.ticks_ms()
    while not _eth.isconnected():
        if time.ticks_diff(time.ticks_ms(), t0) > timeout_s * 1000:
            print("Ethernet baglanamadi (timeout).")
            return None
        time.sleep_ms(200)

    print("Ethernet bagli. IP:", _eth.ifconfig())
    return _eth


def disconnect_ethernet():
    global _eth
    if _eth is not None:
        _eth.active(False)
        print("Ethernet kapatildi.")


# ============================================================
# WIFI
# wifi_secrets.py dosyasindan SSID/parola listesini okur,
# tarama sonucundaki aglarla eslesen ilk agi baglar.
# ============================================================
def _load_wifi_credentials():
    """
    /wifi_secrets.py (veya /sd/wifi_secrets.py) icinde su formatta olmali:

    WIFI_CREDENTIALS = {
        "EvAgi": "parola123",
        "OfisAgi": "baskaParola",
    }
    """
    try:
        import wifi_secrets
        return wifi_secrets.WIFI_CREDENTIALS
    except ImportError:
        pass

    # SD karttan da denenebilir
    try:
        import sys
        sys.path.append("/sd")
        import wifi_secrets
        return wifi_secrets.WIFI_CREDENTIALS
    except Exception:
        print("wifi_secrets.py bulunamadi.")
        return {}


def connect_wifi(timeout_s=15):
    sta = network.WLAN(network.STA_IF)
    sta.active(True)

    credentials = _load_wifi_credentials()
    if not credentials:
        print("Kayitli WiFi bilgisi yok.")
        return None

    print("Aglar taraniyor...")
    networks = sta.scan()  # [(ssid, bssid, channel, RSSI, security, hidden), ...]

    # Sinyal gucune (RSSI) gore en iyiden en kotuye sirala
    networks.sort(key=lambda n: n[3], reverse=True)

    target_ssid = None
    target_pass = None
    for n in networks:
        ssid = n[0].decode("utf-8")
        if ssid in credentials:
            target_ssid = ssid
            target_pass = credentials[ssid]
            break

    if target_ssid is None:
        print("Taranan aglar arasinda kayitli SSID bulunamadi.")
        return None

    print("Baglaniliyor:", target_ssid)
    sta.connect(target_ssid, target_pass)

    t0 = time.ticks_ms()
    while not sta.isconnected():
        if time.ticks_diff(time.ticks_ms(), t0) > timeout_s * 1000:
            print("WiFi baglanamadi (timeout).")
            return None
        time.sleep_ms(200)

    print("WiFi bagli:", target_ssid, "IP:", sta.ifconfig())
    return sta


def disconnect_wifi():
    sta = network.WLAN(network.STA_IF)
    sta.disconnect()
    sta.active(False)
    print("WiFi kapatildi.")


sd = sd_mount()
log_data("test satiri")

eth = connect_ethernet()
wlan = connect_wifi()