# SPDX-FileCopyrightText: 2021 The eminus developers
# SPDX-License-Identifier: Apache-2.0
from dataclasses import dataclass

from numpy import float64
from numpy.typing import NDArray

from .typing import Array1D, Array2D, Array3D

@dataclass
class Occupations:
    _Nelec: int = ...
    _Nspin: int = ...
    _spin: float = ...
    _charge: int = ...
    _Nstate: int = ...
    _Nempty: int = ...
    _Nk: int = ...
    _bands: int = ...
    _smearing: float = ...
    is_filled: bool = ...
    @property
    def Nelec(self) -> int: ...
    @Nelec.setter
    def Nelec(self, value: int) -> None: ...
    @property
    def Nspin(self) -> int: ...
    @Nspin.setter
    def Nspin(self, value: int | None) -> None: ...
    @property
    def spin(self) -> float: ...
    @spin.setter
    def spin(self, value: float | None) -> None: ...
    @property
    def charge(self) -> int: ...
    @charge.setter
    def charge(self, value: int) -> None: ...
    @property
    def f(self) -> NDArray[float64]: ...
    @f.setter
    def f(self, value: float | Array1D | Array2D | Array3D) -> None: ...
    @property
    def Nk(self) -> int: ...
    @Nk.setter
    def Nk(self, value: int) -> None: ...
    @property
    def wk(self) -> NDArray[float64]: ...
    @wk.setter
    def wk(self, value: Array1D) -> None: ...
    @property
    def bands(self) -> int: ...
    @bands.setter
    def bands(self, value: int) -> None: ...
    @property
    def smearing(self) -> float: ...
    @smearing.setter
    def smearing(self, value: float) -> None: ...
    @property
    def magnetization(self) -> float: ...
    @magnetization.setter
    def magnetization(self, value: float | None) -> None: ...
    @property
    def multiplicity(self) -> int: ...
    @property
    def Nstate(self) -> int: ...
    @property
    def Nempty(self) -> int: ...
    @property
    def F(self) -> NDArray[float64]: ...
    def fill(
        self,
        f: float | NDArray[float64] | None = ...,
        magnetization: float | None = ...,
    ) -> Occupations: ...
    kernel = fill
    def smear(self, epsilon: NDArray[float64]) -> float: ...
