import os
import json
import logging
import urllib.request

# Set up logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)

# ----------------------
# Environment variables
# You can set these in your Lambda function configuration
# ----------------------
EXPECTED_API_KEY = os.environ.get("EXPECTED_API_KEY", "")
LINE_CHANNEL_ACCESS_TOKEN = os.environ.get("LINE_CHANNEL_ACCESS_TOKEN", "")
LINE_USER_ID = os.environ.get("LINE_USER_ID", "")

# ----------------------
# Lambda handler
# ----------------------
def lambda_handler(event, context):
    # ----------------------
    # API Key validation
    # ----------------------
    headers = event.get("headers") or {}
    api_key = headers.get("X-API-KEY")
    if EXPECTED_API_KEY and api_key != EXPECTED_API_KEY:
        return respond(401, {"error": "Invalid API Key"})

    # ----------------------
    # Parse payload
    # ----------------------
    try:
        payload = json.loads(event.get("body") or "{}")
    except json.JSONDecodeError:
        return respond(400, {"error": "Invalid JSON"})

    # ----------------------
    # Handle payload
    # ----------------------
    forward_config = {
        "line_token": LINE_CHANNEL_ACCESS_TOKEN,
        "line_user_id": LINE_USER_ID,
    }

    result = handle_payload(payload, forward_config)
    return respond(result["statusCode"], result["body"])


# ----------------------
# Utility functions
# ----------------------
def respond(status_code, body):
    return {
        "statusCode": status_code,
        "headers": {"Content-Type": "application/json"},
        "body": json.dumps(body)
    }


def send_message_to_line(text, token, user_id):
    if not token or not user_id:
        logger.warning("Missing LINE token or userId")
        return

    url = "https://api.line.me/v2/bot/message/push"
    data = json.dumps({
        "to": user_id,
        "messages": [{"type": "text", "text": text}]
    }).encode("utf-8")

    req = urllib.request.Request(
        url,
        data=data,
        headers={
            "Content-Type": "application/json",
            "Authorization": f"Bearer {token}"
        }
    )

    try:
        with urllib.request.urlopen(req) as resp:
            logger.info(f"LINE response: {resp.read().decode()}")
    except Exception as e:
        logger.error(f"Failed to send LINE message: {e}")

# ----------------------
# Payload handler
# ----------------------
def handle_payload(payload, forward_config):
    required_fields = ["hwkey", "message", "hmiName", "hmiTime", "serverTime", "eventType"]
    missing_fields = [f for f in required_fields if f not in payload]
    if missing_fields:
        return {"statusCode": 422, "body": {"error": "Missing required fields", "missing": missing_fields}}

    hwkey = payload["hwkey"]
    message = payload["message"]
    hmiName = payload["hmiName"]
    hmiTime = payload["hmiTime"]
    serverTime = payload["serverTime"]
    eventType = payload["eventType"]
    en_message = message.get("en-US")

    logger.info(f"Processed payload: hwkey={hwkey}, hmiName={hmiName}, eventType={eventType}, serverTime={serverTime} hmiTime={hmiTime}, message={en_message}")

    forward_text = f"Name: {hmiName}\nEvent Type: {eventType}\nMessage: {en_message}\nTime: {serverTime}"
    if forward_config.get("line_token") and forward_config.get("line_user_id"):
        send_message_to_line(forward_text, forward_config["line_token"], forward_config["line_user_id"])

    return {
        "statusCode": 200,
        "body": {
            "status": "ok",
            "rawMessage": message
        }
    }
