import base64
from pathlib import Path
from typing import Optional


def detect_and_save_attachment(
    b64_content: str,
    output_dir: Path,
    filename_prefix: str = "attachment",
    save_attachments: bool = False,
) -> Optional[dict]:
    """
    Определяет тип файла по сигнатуре, сохраняет на диск.

    Возвращает:
    {
        "path": Path,
        "mime_type": str,
        "extension": str,
        "size": int,
        "sha256": str
    }
    """

    ATTACHMENT_SIGNATURES = [
        (b"%PDF-", "application/pdf", ".pdf"),
        (b"\x89PNG\r\n\x1a\n", "image/png", ".png"),
        (b"\xff\xd8\xff", "image/jpeg", ".jpg"),
        (b"PK\x03\x04", "application/zip", ".zip"),
        (b"<?xml", "application/xml", ".xml"),
    ]

    try:
        raw = base64.b64decode(b64_content, validate=True)
    except Exception:
        return None

    mime_type = "application/octet-stream"
    extension = ".bin"

    for signature, detected_mime, detected_ext in ATTACHMENT_SIGNATURES:
        if raw.startswith(signature):
            mime_type = detected_mime
            extension = detected_ext
            break

    if save_attachments:
        output_dir = Path(output_dir).resolve()
        output_dir.mkdir(parents=True, exist_ok=True)

        file_path = output_dir / f"{filename_prefix}{extension}"

        with open(file_path, "wb") as f:
            f.write(raw)
    else:
        file_path = None

    return {
        "path": file_path,
        "mime_type": mime_type,
        "extension": extension,
        "size": len(raw),
    }


def pdfGet(path: str):
    from utils import answer

    try:
        filePath = Path(path)
        if filePath.exists():
            fileBytes = filePath.read_bytes()
            encoded_bytes = base64.b64encode(fileBytes).decode("utf-8")
            return answer(data=encoded_bytes)
        return answer(success=False, message="Файл не найден")
    except Exception as e:
        return answer(success=False, message=str(e))


def p7s_save(signature_data, employee_id):
    """
    Сохраняет файл подписи .p7s для сотрудника

    Args:
        signature_data: данные файла (может быть bytes, list[int], или base64 строка)
        employee_id: идентификатор сотрудника

    Returns:
        dict: статус операции и путь к сохраненному файлу
    """
    from utils import answer

    try:
        # Базовый путь к директории
        base_path = Path("src/attachments/secure")

        # Путь к папке сотрудника
        employee_path = base_path / str(employee_id)

        # Создаем директорию, если её нет
        employee_path.mkdir(parents=True, exist_ok=True)

        # Полный путь к файлу подписи
        signature_path = employee_path / "signature.p7s"

        # Преобразуем входные данные в bytes
        if isinstance(signature_data, list):
            # Если пришел список чисел (как из staff.js)
            file_bytes = bytes(signature_data)
        elif isinstance(signature_data, str):
            # Если пришла base64 строка
            import base64

            file_bytes = base64.b64decode(signature_data)
        elif isinstance(signature_data, bytes):
            # Если уже bytes
            file_bytes = signature_data
        else:
            raise ValueError(f"Неподдерживаемый тип данных: {type(signature_data)}")

        # Сохраняем файл
        with open(signature_path, "wb") as f:
            f.write(file_bytes)

        return answer(data=str(signature_path))

    except Exception as e:
        return answer(success=False, message=str(e))


def p7s_delete(employee_id):
    """
    Удаляет файл подписи сотрудника

    Args:
        employee_id: идентификатор сотрудника

    Returns:
        dict: статус операции
    """
    from utils import answer

    try:
        signature_dir = Path(f"src/attachments/secure/{employee_id}")

        if signature_dir.exists():
            for file in signature_dir.iterdir():
                file.unlink()

            signature_dir.rmdir()

            return answer()
        else:
            return answer(success=False, message="Папка подписи не найдена")

    except Exception as e:
        return answer(success=False, message=str(e))


def p7s_get(employee_id):
    """
    Получает файл подписи сотрудника

    Args:
        employee_id: идентификатор сотрудника

    Returns:
        dict: статус операции и данные файла
    """
    from utils import answer

    try:
        signature_path = Path(f"src/attachments/secure/{employee_id}/signature.p7s")

        if signature_path.exists():
            with open(signature_path, "rb") as f:
                file_bytes = f.read()

            return answer(data=file_bytes)
        else:
            return answer(success=False, message="Файл подписи не найден")

    except Exception as e:
        return answer(success=False, message=str(e))
