import ghttp
import os

def wrapper(serv, addr):
    question, data, headers = serv.read()
    print(f"[{addr[0]}:{addr[1]}] {question[0]} {question[1]}")
    
    if question[0] != 'GET':
        serv.send('<h1>Method not supported!</h1>', status_code='405 Method Not Allowed')
        return
    
    path = ghttp.unparse(question[1])
    normalized_path = path.lstrip('/')
    if normalized_path.startswith('..') or os.path.isabs(normalized_path):
        serv.send('<h1>403 Forbidden</h1>', status_code='403 Forbidden')
        return
    
    # Полный путь к файлу
    full_path = os.path.join('.', normalized_path)
    
    # Проверка существования
    if not os.path.exists(full_path):
        print(f"[{addr[0]}:{addr[1]}] 404 Not Found")
        serv.send('<h1>404 Not Found!</h1>', status_code='404 Not Found')
        return
    
    try:
        if os.path.isdir(full_path):
            # Генерация списка файлов
            files = os.listdir(full_path)
            files.sort()  # Сортировка для удобства
            
            html = f'<h1>Index of {path}</h1>'
            
            # Ссылка на родительскую директорию
            if path != '/':
                parent = os.path.dirname(path.rstrip('/'))
                if not parent:
                    parent = '/'
                html += f'<a href="{parent}"><-- Back</a><br>'
            
            # Список файлов и папок
            for item in files:
                item_path = os.path.join(path, item)
                if os.path.isdir(os.path.join(full_path, item)):
                    item += '/'
                html += f'<a href="{item_path}">{item}</a><br>'
            
            serv.send(html.encode())
            
        else:
            # Отправка файла
            with open(full_path, 'rb') as f:
                content = f.read()
                serv.send(content)
        
        print(f"[{addr[0]}:{addr[1]}] 200 OK")
        
    except Exception as e:
        print(f"[{addr[0]}:{addr[1]}] Error: {e}")
        serv.send('<h1>500 Internal Server Error</h1>', status_code='500 Internal Server Error')

# Запуск сервера
ghttp.server(wrapper)