# SPDX-FileCopyrightText: 2021 The eminus developers
# SPDX-License-Identifier: Apache-2.0
from collections.abc import Sequence

from numpy import bool_, complex128, float64, int64
from numpy.typing import NDArray

from . import operators
from .kpoints import KPoints
from .occupations import Occupations
from .typing import Array1D, Array2D, Array3D, IntArray
from .utils import BaseObject

class Atoms(BaseObject):
    occ: Occupations
    kpts: KPoints
    is_built: bool
    O = operators.O
    L = operators.L
    Linv = operators.Linv
    K = operators.K
    T = operators.T
    I = operators.I
    J = operators.J
    Idag = operators.Idag
    Jdag = operators.Jdag
    def __init__(
        self,
        atom: str | Sequence[str],
        pos: Array1D | Array2D,
        ecut: float | None = ...,
        a: float | Array1D | Array2D | None = ...,
        spin: int | None = ...,
        charge: int = ...,
        unrestricted: bool | None = ...,
        center: bool | None = ...,
        verbose: int | str | None = ...,
    ) -> None: ...
    @property
    def atom(self) -> list[str]: ...
    @atom.setter
    def atom(self, value: str | Sequence[str]) -> None: ...
    @property
    def pos(self) -> NDArray[float64]: ...
    @pos.setter
    def pos(self, value: Array1D | Array2D) -> None: ...
    @property
    def ecut(self) -> float: ...
    @ecut.setter
    def ecut(self, value: float | None) -> None: ...
    @property
    def a(self) -> NDArray[float64]: ...
    @a.setter
    def a(self, value: float | Array1D | Array2D | None) -> None: ...
    @property
    def spin(self) -> int: ...
    @spin.setter
    def spin(self, value: int | None) -> None: ...
    @property
    def charge(self) -> int: ...
    @charge.setter
    def charge(self, value: int) -> None: ...
    @property
    def unrestricted(self) -> bool: ...
    @unrestricted.setter
    def unrestricted(self, value: bool | None) -> None: ...
    @property
    def center(self) -> bool | str: ...
    @center.setter
    def center(self, value: bool | None) -> None: ...
    @property
    def verbose(self) -> str: ...
    @verbose.setter
    def verbose(self, value: int | str | None) -> None: ...
    @property
    def f(self) -> NDArray[float64]: ...
    @f.setter
    def f(self, value: float | Array1D | Array2D | Array3D) -> None: ...
    @property
    def s(self) -> NDArray[int64]: ...
    @s.setter
    def s(self, value: int | IntArray) -> None: ...
    @property
    def Z(self) -> NDArray[int64]: ...
    @Z.setter
    def Z(self, value: int | str | dict[str, int] | None) -> None: ...
    @property
    def Natoms(self) -> int: ...
    @property
    def Ns(self) -> NDArray[int64]: ...
    @property
    def Omega(self) -> float: ...
    @property
    def r(self) -> NDArray[float64]: ...
    @property
    def active(self) -> list[NDArray[bool_]]: ...
    @property
    def G(self) -> NDArray[float64]: ...
    @property
    def G2(self) -> NDArray[float64]: ...
    @property
    def G2c(self) -> NDArray[float64]: ...
    @property
    def Gk2(self) -> NDArray[float64]: ...
    @property
    def Gk2c(self) -> list[NDArray[float64]]: ...
    @property
    def Sf(self) -> NDArray[complex128]: ...
    @property
    def dV(self) -> float: ...
    def build(self) -> Atoms: ...
    kernel = build
    def recenter(self, center: float | Array1D | None = ...) -> Atoms: ...
    def set_k(
        self,
        k: Array2D,
        wk: Array1D | None = ...,
    ) -> Atoms: ...
    def clear(self) -> Atoms: ...
