from typing import Self
import numpy as np
from numpy.typing import ArrayLike
from pyautd3.derive import builder
from pyautd3.derive import datagram
from pyautd3.derive import gain
from pyautd3.derive.derive_datagram import datagram_with_segment
from pyautd3.driver.datagram.gain import Gain
from pyautd3.driver.defined.angle import Angle
from pyautd3.driver.firmware.fpga.emit_intensity import EmitIntensity
from pyautd3.driver.firmware.fpga.phase import Phase
from pyautd3.driver.geometry import Geometry
from pyautd3.native_methods.autd3capi import NativeMethods as Base
from pyautd3.native_methods.autd3capi_driver import GainPtr
from pyautd3.native_methods.structs import Vector3
from pyautd3.gain.cache import Cache
from datetime import timedelta
from pyautd3.driver.datagram.with_timeout import DatagramWithTimeout
from pyautd3.driver.datagram.with_parallel_threshold import DatagramWithParallelThreshold
from pyautd3.native_methods.autd3capi_driver import Segment, TransitionModeWrap
from pyautd3.driver.datagram.with_segment import DatagramWithSegment



class Bessel(Gain):
    def __init__(self: Bessel, pos: ArrayLike, direction: ArrayLike, theta: Angle) -> None: ...
    def _gain_ptr(self: Bessel, _: Geometry) -> GainPtr: ...
    def with_pos(self: Bessel, pos: np.ndarray) -> Bessel: ...
    def with_dir(self: Bessel, dir: np.ndarray) -> Bessel: ...
    def with_theta(self: Bessel, theta: Angle) -> Bessel: ...
    def with_intensity(self: Bessel, intensity: int | EmitIntensity) -> Bessel: ...
    def with_phase_offset(self: Bessel, phase_offset: int | Phase) -> Bessel: ...
    def with_cache(self: Bessel, ) -> Cache[Bessel]: ...
    def with_timeout(self: Bessel, timeout: timedelta | None) -> DatagramWithTimeout[Bessel]: ...
    def with_parallel_threshold(self: Bessel, threshold: int | None) -> DatagramWithParallelThreshold[Bessel]: ...
    def with_segment(self: Bessel, segment: Segment, transition_mode: TransitionModeWrap | None) -> DatagramWithSegment[Bessel]: ...
    @property
    def pos(self: Bessel) -> np.ndarray: ...
    @property
    def dir(self: Bessel) -> np.ndarray: ...
    @property
    def theta(self: Bessel) -> Angle: ...
    @property
    def intensity(self: Bessel) -> EmitIntensity: ...
    @property
    def phase_offset(self: Bessel) -> Phase: ...
