import json
import base64
import io
import sys
from urllib.parse import parse_qs
from app import app as flask_app

def handler(event, context):
    # 1. Извлекаем параметры запроса
    method = event.get('httpMethod', 'GET')
    path = event.get('path', '/')
    headers = {k.lower(): v for k, v in event.get('headers', {}).items()}
    query = event.get('queryStringParameters') or {}
    body = event.get('body', '')
    is_base64 = event.get('isBase64Encoded', False)

    # 2. Декодируем тело (оно может быть в base64)
    if is_base64 and body:
        body = base64.b64decode(body)
    else:
        body = body.encode('utf-8') if isinstance(body, str) else body

    # 3. Строим WSGI-среду
    environ = {
        'REQUEST_METHOD': method,
        'PATH_INFO': path,
        'QUERY_STRING': '&'.join(f'{k}={v}' for k, v in query.items()),
        'CONTENT_TYPE': headers.get('content-type', ''),
        'CONTENT_LENGTH': str(len(body)),
        'SERVER_NAME': 'localhost',
        'SERVER_PORT': '80',
        'SERVER_PROTOCOL': 'HTTP/1.1',
        'wsgi.version': (1, 0),
        'wsgi.url_scheme': 'https' if headers.get('x-forwarded-proto') == 'https' else 'http',
        'wsgi.input': io.BytesIO(body),
        'wsgi.errors': sys.stderr,
        'wsgi.multithread': False,
        'wsgi.multiprocess': True,
        'wsgi.run_once': True,
    }

    # Добавляем остальные заголовки с префиксом HTTP_
    for key, value in headers.items():
        key = key.upper().replace('-', '_')
        if key not in ('CONTENT_TYPE', 'CONTENT_LENGTH'):
            environ[f'HTTP_{key}'] = value

    # 4. Захватываем ответ Flask
    response_status = []
    response_headers = []

    def start_response(status, headers, exc_info=None):
        response_status.append(status)
        response_headers.extend(headers)

    # Вызываем Flask WSGI-приложение
    result = flask_app(environ, start_response)
    response_body = b''.join(result)

    # 5. Формируем ответ для API Gateway
    status_code = int(response_status[0].split()[0])
    headers_dict = {}
    for k, v in response_headers:
        headers_dict.setdefault(k, v)

    # Если тело ответа не текст – не кодируем в base64 (в нашем случае HTML)
    # Но если там изображение – понадобится base64. Пока оставляем как есть.
    return {
        'statusCode': status_code,
        'headers': headers_dict,
        'body': response_body.decode('utf-8'),
        'isBase64Encoded': False
    }