from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_login import LoginManager
from flask_wtf.csrf import CSRFProtect
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address
from flask_mail import Mail
import logging
import re

db = SQLAlchemy()
migrate = Migrate()
login_manager = LoginManager()
login_manager.login_view = "auth.login"
login_manager.login_message = "Please log in to access this page."
csrf = CSRFProtect()
limiter = Limiter(key_func=get_remote_address, default_limits=["200 per hour"])
mail = Mail()

logger = logging.getLogger("jadwa")
logger.setLevel(logging.INFO)
if not logger.handlers:
    handler = logging.StreamHandler()
    handler.setFormatter(logging.Formatter("[%(asctime)s] %(levelname)s %(name)s: %(message)s"))
    logger.addHandler(handler)


ALLOWED_TAGS = {
    "h1", "h2", "h3", "h4", "h5", "h6", "p", "br", "hr",
    "strong", "b", "em", "i", "u", "s", "mark",
    "ul", "ol", "li", "dl", "dt", "dd",
    "table", "thead", "tbody", "tr", "th", "td",
    "div", "span", "section", "article", "header", "footer",
    "a", "img", "blockquote", "pre", "code",
    "svg", "path", "circle", "rect", "line",
}
ALLOWED_ATTRS = {"class", "style", "id", "href", "src", "alt", "width", "height",
                 "colspan", "rowspan", "target", "rel", "viewBox", "d", "fill",
                 "stroke", "stroke-width", "cx", "cy", "r", "x", "y", "x1", "y1", "x2", "y2"}

_SCRIPT_RE = re.compile(r"<\s*script[^>]*>.*?<\s*/\s*script\s*>", re.DOTALL | re.IGNORECASE)
_EVENT_RE = re.compile(r'\s+on\w+\s*=\s*["\'][^"\']*["\']', re.IGNORECASE)
_JS_URI_RE = re.compile(r'(href|src)\s*=\s*["\']javascript:', re.IGNORECASE)


def sanitize_html(html_content: str) -> str:
    if not html_content:
        return ""
    html_content = _SCRIPT_RE.sub("", html_content)
    html_content = _EVENT_RE.sub("", html_content)
    html_content = _JS_URI_RE.sub(r'\1="', html_content)
    return html_content
