from machine import Pin, PWM
import time
import network
import urequests
import json

# ===== Cấu hình Wi-Fi =====
WIFI_SSID = "Wokwi-GUEST"
WIFI_PASSWORD = ""

# ===== Cấu hình Firebase =====
FIREBASE_URL = "https://projectcuoiki-51209-default-rtdb.firebaseio.com/location"
FIREBASE_API_KEY = "AIzaSyAm4o2RszcNNmXJ0aMiowiSuBxtFJ5rrkY"

# ===== Cấu hình đèn LED và buzzer =====
led = Pin(2, Pin.OUT)
led.off()

button_buzzer = Pin(35, Pin.IN, Pin.PULL_DOWN)
button_led = Pin(34, Pin.IN, Pin.PULL_DOWN)

buzzer = PWM(Pin(21))
buzzer.deinit()

# ===== Kết nối Wi-Fi =====
def connect_wifi():
    print("Đang kết nối Wi-Fi...")
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    wlan.connect(WIFI_SSID, WIFI_PASSWORD)

    while not wlan.isconnected():
        print("Đang chờ kết nối Wi-Fi...")
        time.sleep(1)

    print("Wi-Fi đã kết nối:", wlan.ifconfig())

# ===== Xử lý chuỗi Unicode không có unicodedata =====
def remove_unicode_simple(text):
    """Chuyển đổi chuỗi Unicode sang chuỗi không dấu ASCII"""
    conversion_table = {
        'àáảãạâầấẩẫậăằắẳẵặ': 'a',
        'èéẻẽẹêềếểễệ': 'e',
        'ìíỉĩị': 'i',
        'òóỏõọôồốổỗộơờớởỡợ': 'o',
        'ùúủũụưừứửữự': 'u',
        'ỳýỷỹỵ': 'y',
        'đ': 'd',
        'ÀÁẢÃẠÂẦẤẨẪẬĂẰẮẲẴẶ': 'A',
        'ÈÉẺẼẸÊỀẾỂỄỆ': 'E',
        'ÌÍỈĨỊ': 'I',
        'ÒÓỎÕỌÔỒỐỔỖỘƠỜỚỞỠỢ': 'O',
        'ÙÚỦŨỤƯỪỨỬỮỰ': 'U',
        'ỲÝỶỸỴ': 'Y',
        'Đ': 'D'
    }
    for chars, replacement in conversion_table.items():
        for char in chars:
            text = text.replace(char, replacement)
    return text

# ===== Lấy địa chỉ từ tọa độ qua OpenStreetMap =====
def get_address_from_coordinates(latitude, longitude):
    url = f"https://nominatim.openstreetmap.org/reverse?format=json&lat={latitude}&lon={longitude}"
    headers = {"User-Agent": "ESP32 Smart Cane Project"}
    print(f"Gửi yêu cầu tới OpenStreetMap: {url}")
    try:
        response = urequests.get(url, headers=headers)
        if response.status_code == 200:
            data = response.json()
            address = data.get("display_name", "Không thể lấy địa chỉ")
            print(f"Địa chỉ: {address}")
            return address
        else:
            print(f"Lỗi OpenStreetMap: {response.status_code}")
            return "Không xác định địa chỉ"
    except Exception as e:
        print(f"Lỗi khi gửi yêu cầu OpenStreetMap: {e}")
        return "Không xác định địa chỉ"

# ===== Gửi dữ liệu tới Firebase =====
def send_to_firebase(location, latitude, longitude):
    try:
        # Xóa Unicode trước khi gửi
        clean_location = remove_unicode_simple(location)

        # Payload JSON
        payload = {
            "address": clean_location,
            "latitude": latitude,
            "longitude": longitude
        }

        # Firebase URL
        url = f"{FIREBASE_URL}.json?auth={FIREBASE_API_KEY}"
        headers = {"Content-Type": "application/json"}

        print(f"Gửi dữ liệu tới Firebase: {url}")
        print(f"Payload: {json.dumps(payload)}")
        response = urequests.put(url, headers=headers, data=json.dumps(payload))

        if response.status_code == 200:
            print("Dữ liệu đã được gửi tới Firebase thành công!")
        else:
            print(f"Lỗi khi gửi dữ liệu tới Firebase: {response.status_code} - {response.text}")
    except Exception as e:
        print(f"Lỗi khi gửi dữ liệu tới Firebase: {e}")

# ===== Chương trình chính =====
def main():
    connect_wifi()

    while True:
        if button_buzzer.value() == 1:  # Khi nút buzzer được nhấn
            print("Chế độ khẩn cấp kích hoạt!")
            buzzer.init(freq=1000, duty=512)
            latitude = 10.731899765883608 # Tọa độ ví dụ
            longitude = 106.69929887972742
            address = get_address_from_coordinates(latitude, longitude)
            print(f"Địa chỉ nhận được: {address}")
            send_to_firebase(address, latitude, longitude)
        else:
            buzzer.deinit()
            print("Buzzer tắt - Không khẩn cấp")

        if button_led.value() == 1:  # Khi nút LED được nhấn
            led.on()
            print("Đèn LED bật!")
        else:
            led.off()
            print("Đèn LED tắt!")

        time.sleep(3)

# ===== Chạy chương trình =====
main()
$abcdeabcde151015202530fghijfghij