"""
[단계 4] Python 기초 + ESP32에 첫 UDP 메시지 보내기

학습 목표:
  - 변수, 함수, 조건문, 반복문 사용
  - UDP 소켓 만들고 JSON 메시지 송신
  - ESP32 시리얼 모니터에서 수신 확인

사용법:
  1) ESP32_IP를 본인 차량의 IP로 변경
  2) python 단계4_파이썬기초.py 실행
  3) ESP32 시리얼 모니터에서 'Received: ...' 메시지 확인

힌트:
  ESP32 IP는 시리얼 모니터 부팅 메시지에서 확인할 수 있습니다.
  예: "WiFi connected. IP: 192.168.137.74"
"""

import socket
import json
import time

# ──────────────────────────────────────────
# 설정
# ──────────────────────────────────────────

# TODO 1: ESP32_IP를 본인 차량의 IP로 변경하세요
ESP32_IP = "192.168.137.74"
ESP32_PORT = 4210


# ──────────────────────────────────────────
# 함수
# ──────────────────────────────────────────

def make_command(speed, steering):
    """
    속도와 조향각으로 명령 딕셔너리를 만든다.

    Args:
        speed (int): -255 ~ 255 (양수=전진, 음수=후진)
        steering (int): 45 ~ 135 (90=직진)

    Returns:
        dict: {"speed": ..., "steering": ...}
    """
    # TODO 2: speed와 steering을 담은 딕셔너리를 반환하세요
    pass


def send_command(sock, ip, port, command):
    """
    명령을 JSON 문자열로 변환해 UDP로 송신.
    """
    data = json.dumps(command).encode('utf-8')
    sock.sendto(data, (ip, port))
    print(f"보냄: {command}")


# ──────────────────────────────────────────
# 메인
# ──────────────────────────────────────────

def main():
    # UDP 소켓 만들기
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    print(f"ESP32 대상: {ESP32_IP}:{ESP32_PORT}")

    # ── 미션 1: 정지 명령 한 번 보내기 ──
    cmd = make_command(speed=0, steering=90)
    send_command(sock, ESP32_IP, ESP32_PORT, cmd)
    time.sleep(1)

    # ── 미션 2: 5번 반복하며 좌→우 스윕 ──
    print("\n좌→우 스윕 시작 (5회)")
    for steering in range(45, 136, 20):  # 45, 65, 85, 105, 125
        # TODO 3: speed=0(정지), 위 steering 값으로 명령 보내기
        # 그리고 0.5초 대기
        pass

    # ── 미션 3: 정지로 마무리 ──
    cmd = make_command(speed=0, steering=90)
    send_command(sock, ESP32_IP, ESP32_PORT, cmd)
    print("\n종료")
    sock.close()


if __name__ == "__main__":
    main()


# ════════════════════════════════════════════════════════════
# 정답 (스스로 풀어 본 후 펼쳐 보세요)
# ════════════════════════════════════════════════════════════
"""
[TODO 2 정답]
def make_command(speed, steering):
    return {"speed": speed, "steering": steering}

[TODO 3 정답]
for steering in range(45, 136, 20):
    cmd = make_command(speed=0, steering=steering)
    send_command(sock, ESP32_IP, ESP32_PORT, cmd)
    time.sleep(0.5)
"""
