"""
tasks_app.py — تشغيل التاسكات كموقع مستقل (من غير سكريبت المراقبة)

الملفات المطلوبة جنب بعض:  tasks_app.py  +  tasks.py
التشغيل:
    pip install fastapi uvicorn
    uvicorn tasks_app:app --host 0.0.0.0 --port 8090

كلمة سر (اختياري لكن مهم لو الموقع على الإنترنت):
    TASKS_USER=admin TASKS_PASS=كلمة_سر_قوية uvicorn tasks_app:app --host 0.0.0.0 --port 8090

قاعدة البيانات: tasks.db جنب الملف (أو غيّر المسار بالمتغير TASKS_DB)
"""
import base64
import os
import secrets
import sqlite3

from fastapi import FastAPI, Request
from fastapi.responses import RedirectResponse, Response

import tasks

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
DB_PATH = os.getenv("TASKS_DB", os.path.join(BASE_DIR, "tasks.db"))
AUTH_USER = os.getenv("TASKS_USER", "")
AUTH_PASS = os.getenv("TASKS_PASS", "")


def get_db() -> sqlite3.Connection:
    conn = sqlite3.connect(DB_PATH, check_same_thread=False)
    conn.row_factory = sqlite3.Row
    return conn


app = FastAPI(title="Tasks")


@app.middleware("http")
async def basic_auth(request: Request, call_next):
    if AUTH_USER and AUTH_PASS:
        ok = False
        header = request.headers.get("authorization", "")
        if header.lower().startswith("basic "):
            try:
                user, _, pw = base64.b64decode(header[6:]).decode("utf-8").partition(":")
                ok = secrets.compare_digest(user, AUTH_USER) and secrets.compare_digest(pw, AUTH_PASS)
            except Exception:
                ok = False
        if not ok:
            return Response("Unauthorized", status_code=401, headers={"WWW-Authenticate": 'Basic realm="Tasks"'})
    return await call_next(request)


tasks.register(app, get_db, standalone=True)


@app.get("/")
async def root():
    return RedirectResponse("/tasks")


if __name__ == "__main__":
    import uvicorn

    uvicorn.run("tasks_app:app", host="0.0.0.0", port=8090)
