import network
import ntptime
import utime
from machine import Pin, I2C, RTC
import ssd1306
from characters import CHARACTER_DATA  # 請確保字典中含有 '/' 半形(8×16)

# ====== WiFi 設定 ======
SSID = "Wokwi-GUEST"
PASSWORD = ""

print("連線中...")
wlan_sta = network.WLAN(network.STA_IF)
wlan_sta.active(True)
wlan_sta.connect(SSID, PASSWORD)

tmstart = utime.ticks_ms()
while not wlan_sta.isconnected():
    if utime.ticks_diff(utime.ticks_ms(), tmstart) > 100000:
        print(" WiFi 連線超時")
        break
    utime.sleep(0.5)
    print(".", end="")

print("\n WiFi 連線成功IP:", wlan_sta.ifconfig())

# ====== NTP 對時 ======
try:
    ntptime.host = "0.pool.ntp.org"
    ntptime.settime()
    print(" 已透過 NTP 自動對時")
except Exception as e:
    print(" NTP 對時失敗:", e)

# ====== RTC 與 OLED 初始化 ======
rtc = RTC()
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)

# ====== 中文/半形 繪圖函式 ======
def draw_character(data, x, y):
    if len(data) == 32:
        # 中文全形:16x16
        for row in range(16):
            for byte_index in range(2):
                byte_val = data[row * 2 + byte_index]
                for bit in range(8):
                    if byte_val & (1 << bit):  # ← 低位在左
                        oled.pixel(x + byte_index * 8 + bit, y + row, 1)
    elif len(data) == 16:
        # 半形字元:8x16
        for row in range(16):
            byte_val = data[row]
            for bit in range(8):
                if byte_val & (1 << bit):  # ← 低位在左
                    oled.pixel(x + bit, y + row, 1)


def display_text_string(oled, text, start_x=0, start_y=0, spacing=1):
    x_offset = start_x
    for char in text:
        if char in CHARACTER_DATA:
            data = CHARACTER_DATA[char]
            draw_character(data, x_offset, start_y)
            x_offset += 16 + spacing if len(data) == 32 else 8 + spacing
        else:
            oled.text(char, x_offset, start_y + 6)
            x_offset += 8 + spacing

# ====== 星期對應 ======
WEEKDAYS = ["1", "2", "3", "4", "5", "6", "7"]

# ====== 主程式迴圈 ======
while True:
    oled.fill(0)
    now = list(rtc.datetime())
    now[4] = (now[4] + 8) % 24  # 手動修正時區為 UTC+8

    year, month, day = now[0], now[1], now[2]
    weekday = WEEKDAYS[now[3] % 7]
    hour, minute, second = now[4], now[5], now[6]
    roc_year = year - 1911

    # --- 第一行:姓名 學號 ---
    # 第一行:姓名 + 學號(只顯示後5碼)
    display_text_string(oled, "趙均奇", 0, 0)
    oled.text("b11113028", 64, 0)

# 第二行:年月日(固定寬度 60px 後開始顯示)
    display_text_string(oled, "年/月/日", 0, 16)
    oled.text(f"{roc_year}/{month:02d}/{day:02d}", 64, 16)

# 第三行:星期
    display_text_string(oled, "星期", 0, 32)
    oled.text(weekday, 64, 32)

# 第四行:時分秒(不要太靠右)
    display_text_string(oled, "時/分/秒", 0, 48)
    oled.text(f"{hour:02d}:{minute:02d}:{second:02d}", 64, 48)


    oled.show()

    # 同步印出至串口
    print("(B11113028, 趙均奇) 現在時間: 中華民國 {} 年 {} 月 {} 日 星期 {} - {:02d}:{:02d}:{:02d}.{:03d}".format(
        roc_year, month, day, weekday, hour, minute, second, utime.ticks_ms() % 1000
    ))

    utime.sleep(1)