from typing import Iterable

from flask import request

from .extensions import db
from .models import AccessKey, AccessLog, BatchCredential, DeliveryBatch
from .security import client_ip, generate_access_key, hash_access_key, mask_access_key


def log_event(event_type: str, *, batch: DeliveryBatch | None = None, access_key: AccessKey | None = None, detail: str | None = None) -> None:
    entry = AccessLog(
        batch=batch,
        access_key=access_key,
        event_type=event_type,
        detail=detail,
        ip_address=client_ip(),
        user_agent=(request.headers.get("User-Agent", "")[:255] or None),
    )
    db.session.add(entry)


def add_credentials(batch: DeliveryBatch, raw_credentials: Iterable[str]) -> None:
    for index, credential in enumerate(raw_credentials):
        item = BatchCredential(batch=batch, sort_order=index)
        item.value = credential
        db.session.add(item)


def issue_keys(
    batch: DeliveryBatch,
    *,
    count: int,
    expires_at=None,
    max_views=None,
    notes: str | None = None,
) -> list[str]:
    generated: list[str] = []
    for _ in range(count):
        raw_key = generate_access_key()
        access_key = AccessKey(
            batch=batch,
            key_hash=hash_access_key(raw_key),
            key_hint=mask_access_key(raw_key),
            expires_at=expires_at,
            max_views=max_views,
            notes=notes,
        )
        db.session.add(access_key)
        generated.append(raw_key)
    return generated
