import os
from typing import Annotated

import django
from django.conf import settings as django_settings
from fastapi import Cookie, Depends, FastAPI, Header
from fastapi.responses import HTMLResponse, RedirectResponse
from sqlalchemy.orm import Session
from starlette.requests import Request

from redirect.db.curd import LinkNotFoundException, get_link_by_slug
from redirect.db.dependency import get_db
from redirect.settings import settings

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.local")
django.setup()
app = FastAPI()


from akarpov.tools.shortener.tasks import (  # noqa: This has to be imported strictly AFTER django setup
    save_view_meta,
)

settings.relative_base = django_settings.SHORTENER_REDIRECT_TO


@app.exception_handler(LinkNotFoundException)
async def unicorn_exception_handler(request: Request, exc: LinkNotFoundException):
    return HTMLResponse(
        status_code=404,
        # language=HTML
        content="""
        <html lang="en">
            <head>
                <title>Unknown Link</title>
                <style>
                    h1 {
                        font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", ui-system, sans-serif;
                        font-weight: bold;
                        font-size: medium;
                        text-align: center;
                    }
                </style>
            </head>
        <body>
            <h1>Such link doesn't exist or has been revoked</h1>
        </body>
        </html>
        """,
    )


@app.get("/{slug}")
def redirect(
    slug: str,
    request: Request,
    db: Session = Depends(get_db),
    user_agent: Annotated[str | None, Header()] = None,
    sessionid: Annotated[str | None, Cookie()] = None,
) -> RedirectResponse:
    """Main route that redirects to a page based on the slug."""
    if "+" in slug:
        return RedirectResponse(url=f'/tools/shortener/p/{slug.replace("+", "")}')

    link_id, link_target = get_link_by_slug(db, slug)

    save_view_meta.apply_async(
        kwargs={
            "pk": link_id,
            "ip": request.client.host,
            "user_agent": user_agent,
            "user_id": sessionid,
        },
    )

    return RedirectResponse(
        url=(settings.relative_base + link_target)
        if link_target.startswith("/")
        else link_target
    )