# -*- coding: utf-8 -*-
"""
加密基类
定义加密器的统一接口
"""

from abc import ABC, abstractmethod
from typing import Optional

from ..exceptions import CryptoError


class CryptoBase(ABC):
    """加密基类"""

    def __init__(self, password: str, salt: bytes):
        """
        初始化加密器

        Args:
            password: 加密密码
            salt: 盐值
        """
        self.password = password
        self.salt = salt
        self._key: Optional[bytes] = None

    @abstractmethod
    async def derive_key(self) -> None:
        """
        从密码派生密钥

        Raises:
            CryptoError: 密钥派生失败
        """
        pass

    @abstractmethod
    async def encrypt(self, data: bytes, offset: int = 0) -> bytes:
        """
        加密数据

        Args:
            data: 要加密的数据
            offset: 数据偏移（用于生成 nonce）

        Returns:
            bytes: 加密后的数据

        Raises:
            CryptoError: 加密失败
        """
        pass

    def _ensure_key_derived(self) -> None:
        """
        确保密钥已派生

        Raises:
            CryptoError: 密钥未派生
        """
        if self._key is None:
            raise CryptoError("密钥未派生，请先调用 derive_key()")
