# Copyright (C) 2026 NPO NT
# SPDX-License-Identifier: AGPL-3.0-only

from __future__ import annotations

from dataclasses import dataclass

from .models import Action, Severity


@dataclass(frozen=True, slots=True)
class CategoryPolicy:
    code: str
    label_ru: str
    action: Action
    severity: Severity
    description: str


MIKA_NAVIGATION_CATEGORIES: dict[str, CategoryPolicy] = {
    "person_name": CategoryPolicy(
        "person_name",
        "ФИО или имя человека",
        Action.REDACT,
        Severity.CRITICAL,
        "Прямой идентификатор пациента, родственника или другого физического лица.",
    ),
    "birth_date": CategoryPolicy(
        "birth_date",
        "Дата рождения",
        Action.REDACT,
        Severity.CRITICAL,
        "Точная дата рождения удаляется; клинически необходимый возраст вводится отдельно.",
    ),
    "phone": CategoryPolicy(
        "phone",
        "Телефон",
        Action.REDACT,
        Severity.CRITICAL,
        "Контактный номер физического лица.",
    ),
    "email": CategoryPolicy(
        "email",
        "Электронная почта",
        Action.REDACT,
        Severity.CRITICAL,
        "Адрес электронной почты.",
    ),
    "snils": CategoryPolicy(
        "snils",
        "СНИЛС",
        Action.REDACT,
        Severity.CRITICAL,
        "Страховой номер индивидуального лицевого счёта.",
    ),
    "passport": CategoryPolicy(
        "passport",
        "Паспорт или документ",
        Action.REDACT,
        Severity.CRITICAL,
        "Серия и номер документа, удостоверяющего личность.",
    ),
    "insurance_policy": CategoryPolicy(
        "insurance_policy",
        "Полис ОМС/ДМС",
        Action.REDACT,
        Severity.CRITICAL,
        "Номер страхового полиса.",
    ),
    "medical_record_id": CategoryPolicy(
        "medical_record_id",
        "Медицинский идентификатор",
        Action.REDACT,
        Severity.HIGH,
        "Номер карты, истории болезни, направления, исследования или образца.",
    ),
    "address": CategoryPolicy(
        "address",
        "Адрес",
        Action.REDACT,
        Severity.HIGH,
        "Адрес проживания, регистрации или доставки.",
    ),
    "barcode": CategoryPolicy(
        "barcode",
        "QR-код или штрихкод",
        Action.REDACT,
        Severity.CRITICAL,
        "Машиночитаемый код может содержать идентификатор или ссылку с токеном.",
    ),
    "event_date": CategoryPolicy(
        "event_date",
        "Клиническая дата — сохраняется",
        Action.REVIEW,
        Severity.MEDIUM,
        "Дата анализа, исследования, операции или лечения сохраняется по умолчанию; удаление возможно только после явного решения пользователя.",
    ),
    "organization": CategoryPolicy(
        "organization",
        "Организация или подразделение",
        Action.REVIEW,
        Severity.MEDIUM,
        "Небольшая клиника или подразделение может быть косвенным идентификатором.",
    ),
    "manual": CategoryPolicy(
        "manual",
        "Область, добавленная вручную",
        Action.REDACT,
        Severity.CRITICAL,
        "Пользователь вручную отметил область для физического удаления.",
    ),
}


CRITICAL_RESIDUAL_CATEGORIES = {
    "person_name",
    "birth_date",
    "phone",
    "email",
    "snils",
    "passport",
    "insurance_policy",
    "medical_record_id",
    "address",
    "barcode",
}


def category_policy(code: str) -> CategoryPolicy:
    return MIKA_NAVIGATION_CATEGORIES.get(code, MIKA_NAVIGATION_CATEGORIES["manual"])
