import psycopg2
from flask import Flask, g, render_template_string, request
from psycopg2.extras import RealDictCursor

app = Flask(__name__)

DB_CONFIG = {
    "host": "postgres.openclaw.svc.cluster.local",
    "port": 5432,
    "user": "edisclosure",
    "password": "veJEFrqvLLtd",
    "database": "edisclosure",
}


def get_db():
    db = getattr(g, "_database", None)
    if db is None:
        db = g._database = psycopg2.connect(**DB_CONFIG, cursor_factory=RealDictCursor)
    return db


@app.teardown_appcontext
def close_connection(exception):
    db = getattr(g, "_database", None)
    if db is not None:
        db.close()


HTML = """
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>eDisk API</title>
    <style>
        body { font-family: Arial, sans-serif; margin: 20px; background: #f5f5f5; }
        h1, h2, h3 { color: #333; }
        nav { margin-bottom: 20px; padding: 10px; background: #fff; }
        nav a { margin-right: 20px; text-decoration: none; color: #0066cc; font-weight: bold; }
        nav a.active { color: #000; }
        .endpoint { background: #fff; padding: 15px; margin: 10px 0; border-radius: 5px; border-left: 4px solid #0066cc; }
        .method { display: inline-block; padding: 3px 8px; border-radius: 3px; font-weight: bold; }
        .get { background: #61affe; color: #fff; }
        .param { color: #666; font-size: 14px; }
        code { background: #eee; padding: 2px 5px; border-radius: 3px; }
        pre { background: #2d2d2d; color: #f8f8f2; padding: 15px; border-radius: 5px; overflow-x: auto; }
        table { border-collapse: collapse; width: 100%; background: white; margin-top: 10px; }
        th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
        th { background: #f0f0f0; }
        .event-link { color: #0066cc; text-decoration: none; }
        .event-link:hover { text-decoration: underline; }
        .pagination { margin-top: 15px; }
        .pagination a, .pagination span { margin: 0 5px; color: #0066cc; }
        .info { color: #666; margin-bottom: 10px; }
        .search { margin: 10px 0; }
        .search input, .search select { padding: 5px; }
        .search button { padding: 5px 15px; }
        .event-full { background: white; padding: 20px; margin-top: 15px; border: 1px solid #ddd; }
        .event-meta { color: #666; font-size: 12px; margin-bottom: 10px; }
        .back-link { margin-top: 20px; display: block; }
    </style>
</head>
<body>
    <nav>
        <a href="/" class="{{ 'active' if active=='home' else '' }}">API Docs</a>
        <a href="/events" class="{{ 'active' if active=='events' else '' }}">Events</a>
    </nav>
    {{ content | safe }}
</body>
</html>
"""

HOME_HTML = """
<h1>eDisclosure Events API</h1>
<p>REST API для доступа к событиям раскрытия информации компаниями.</p>

<h2>Endpoints</h2>

<div class="endpoint">
    <h3><span class="method get">GET</span> /events</h3>
    <p>Получить список событий с фильтрацией, сортировкой и пагинацией.</p>

    <h4>Параметры:</h4>
    <table>
        <tr><th>Параметр</th><th>Тип</th><th>Описание</th></tr>
        <tr><td><code>secid</code></td><td>string</td><td>Фильтр по тикеру ценной бумаги (например, GAZP, SBER)</td></tr>
        <tr><td><code>inn</code></td><td>string</td><td>Фильтр по ИНН компании</td></tr>
        <tr><td><code>q</code></td><td>string</td><td>Поиск по названию события и названию компании (substring)</td></tr>
        <tr><td><code>text</code></td><td>string</td><td>Поиск по полному тексту события (substring)</td></tr>
        <tr><td><code>sort</code></td><td>string</td><td>Сортировка по дате: <code>desc</code> (новые первыми) или <code>asc</code> (старые первыми)</td></tr>
        <tr><td><code>page</code></td><td>int</td><td>Номер страницы (по умолчанию: 1)</td></tr>
        <tr><td><code>size</code></td><td>int</td><td>Размер страницы (по умолчанию: 50, макс: 100)</td></tr>
    </table>

    <h4>Примеры запросов:</h4>
    <pre>/events?secid=GAZP&sort=desc
/events?inn=7736050003&sort=asc&page=2
/events?q=дивиденд&text=выплата
/events?sort=desc&size=100</pre>
</div>

<div class="endpoint">
    <h3><span class="method get">GET</span> /event/&lt;event_id&gt;</h3>
    <p>Получить детали конкретного события по его ID.</p>
    <h4>Пример:</h4>
    <pre>/event/HRpA9UHzzUu9GQuXbnu4pA-B-B</pre>
</div>

<h2>Статистика базы данных</h2>
<ul>
    <li>Всего событий: <strong>{{ events_count }}</strong></li>
    <li>Всего компаний: <strong>{{ companies_count }}</strong></li>
</ul>
"""

EVENTS_HTML = """
<h2>Events</h2>
<p class="info">Всего: {{ total }}</p>
<form class="search" method="get">
    <input type="text" name="q" value="{{ search }}" placeholder="Поиск по названию...">
    <input type="text" name="secid" value="{{ secid }}" placeholder="Тикер (SECID)">
    <input type="text" name="inn" value="{{ inn }}" placeholder="ИНН">
    <select name="sort">
        <option value="desc" {{ 'selected' if sort=='desc' else '' }}>Новые первыми</option>
        <option value="asc" {{ 'selected' if sort=='asc' else '' }}>Старые первыми</option>
    </select>
    <select name="size">
        <option value="50" {{ 'selected' if size==50 else '' }}>50</option>
        <option value="100" {{ 'selected' if size==100 else '' }}>100</option>
        <option value="200" {{ 'selected' if size==200 else '' }}>200</option>
    </select>
    <button type="submit">Найти</button>
</form>
<table>
    <tr><th>Дата</th><th>Компания</th><th>Событие</th><th>SECID</th></tr>
    {% for row in rows %}
    <tr>
        <td>{{ row.event_date }}</td>
        <td>{{ row.company_name or '' }}</td>
        <td><a href="/event/{{ row.event_id }}" class="event-link">{{ row.event_name or '' }}</a></td>
        <td>{{ row.secid or '' }}</td>
    </tr>
    {% endfor %}
</table>
<div class="pagination">
    {% if page > 1 %}
        <a href="?page={{ page-1 }}&q={{ search }}&secid={{ secid }}&inn={{ inn }}&sort={{ sort }}&size={{ size }}">← Назад</a>
    {% endif %}
    <span>Страница {{ page }} из {{ pages }}</span>
    {% if page < pages %}
        <a href="?page={{ page+1 }}&q={{ search }}&secid={{ secid }}&inn={{ inn }}&sort={{ sort }}&size={{ size }}">Вперёд →</a>
    {% endif %}
</div>
"""

EVENT_DETAIL_HTML = """
<h2>{{ event.event_name or 'Event Details' }}</h2>
<p class="event-meta">
    Дата: {{ event.event_date }} |
    Компания: {{ event.company_name or '' }} |
    INN: {{ event.inn or '' }} |
    SECID: {{ event.secid or '' }}
</p>
<div class="event-full">
    <h3>Полный текст:</h3>
    <pre>{{ event.text or 'Нет данных' }}</pre>
</div>
<a href="/events" class="back-link">← Назад к списку</a>
"""


@app.route("/")
def index():
    db = get_db()
    cur = db.cursor()
    cur.execute("SELECT COUNT(*) as cnt FROM events_all")
    events_count = cur.fetchone()["cnt"]
    cur.execute("SELECT COUNT(*) as cnt FROM companies")
    companies_count = cur.fetchone()["cnt"]
    cur.close()
    return render_template_string(
        HTML.replace("{{ content | safe }}", HOME_HTML),
        active="home",
        events_count=events_count,
        companies_count=companies_count,
    )


@app.route("/events")
def events():
    db = get_db()
    cur = db.cursor()

    search = request.args.get("q", "")
    inn = request.args.get("inn", "")
    secid = request.args.get("secid", "")
    text_search = request.args.get("text", "")
    sort = request.args.get("sort", "desc")
    page = int(request.args.get("page", 1))
    size = min(int(request.args.get("size", 50)), 200)

    where, params = [], []

    if search:
        where.append("(event_name LIKE %s OR company_name LIKE %s)")
        params.extend([f"%{search}%", f"%{search}%"])

    if inn:
        where.append("inn = %s")
        params.append(inn)

    if secid:
        where.append("secid = %s")
        params.append(secid)

    if text_search:
        where.append("text LIKE %s")
        params.append(f"%{text_search}%")

    order = (
        "TO_DATE(event_date, 'DD.MM.YYYY') DESC"
        if sort == "desc"
        else "TO_DATE(event_date, 'DD.MM.YYYY') ASC"
    )

    if where:
        where_str = "WHERE " + " AND ".join(where)
        cur.execute(f"SELECT COUNT(*) as cnt FROM events_all {where_str}", params)
        total = cur.fetchone()["cnt"]
        cur.execute(
            f"SELECT event_id, event_date, event_name, company_name, inn, secid "
            f"FROM events_all {where_str} ORDER BY {order} LIMIT {size} OFFSET {(page - 1) * size}",
            params,
        )
    else:
        cur.execute("SELECT COUNT(*) as cnt FROM events_all")
        total = cur.fetchone()["cnt"]
        cur.execute(
            f"SELECT event_id, event_date, event_name, company_name, inn, secid "
            f"FROM events_all ORDER BY {order} LIMIT {size} OFFSET {(page - 1) * size}"
        )

    rows = cur.fetchall()
    cur.close()
    pages = (total + size - 1) // size if total > 0 else 1

    return render_template_string(
        HTML.replace("{{ content | safe }}", EVENTS_HTML),
        active="events",
        rows=rows,
        total=total,
        page=page,
        pages=pages,
        search=search,
        secid=secid,
        inn=inn,
        sort=sort,
        size=size,
    )


@app.route("/event/<event_id>")
def event_detail(event_id):
    db = get_db()
    cur = db.cursor()
    cur.execute(
        "SELECT event_id, event_date, event_name, company_name, inn, secid, text "
        "FROM events_all WHERE event_id = %s",
        (event_id,),
    )
    event = cur.fetchone()
    cur.close()

    if event is None:
        return render_template_string(
            HTML.replace(
                "{{ content | safe }}",
                "<h2>Событие не найдено</h2><a href='/events' class='back-link'>← Назад</a>",
            ),
            active="events",
        )

    return render_template_string(
        HTML.replace("{{ content | safe }}", EVENT_DETAIL_HTML),
        active="events",
        event=event,
    )


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=80)
