from collections.abc import Callable
from typing import overload

from pymeeus.Angle import Angle

class CurveFitting:
    @overload
    def __init__(self) -> None: ...
    @overload
    def __init__(self, a: CurveFitting, /) -> None: ...
    @overload
    def __init__(self, a: list[float | Angle] | tuple[float | Angle, ...], /) -> None: ...
    @overload
    def __init__(
        self, a1: list[float | Angle] | tuple[float | Angle, ...], a2: list[float | Angle] | tuple[float | Angle, ...], /
    ) -> None: ...
    @overload
    def __init__(
        self, a1: float | Angle, a2: float | Angle, a3: float | Angle, a4: float | Angle, /, *rest: float | Angle
    ) -> None: ...

    @overload
    def set(self) -> None: ...
    @overload
    def set(self, a: CurveFitting, /) -> None: ...
    @overload
    def set(self, a: list[float | Angle] | tuple[float | Angle, ...], /) -> None: ...
    @overload
    def set(
        self, a1: list[float | Angle] | tuple[float | Angle, ...], a2: list[float | Angle] | tuple[float | Angle, ...], /
    ) -> None: ...
    @overload
    def set(
        self, a1: float | Angle, a2: float | Angle, a3: float | Angle, a4: float | Angle, /, *rest: float | Angle
    ) -> None: ...

    def __len__(self) -> int: ...
    def correlation_coeff(self) -> float: ...
    def linear_fitting(self) -> tuple[float, float]: ...
    def quadratic_fitting(self) -> tuple[float, float, float]: ...
    def general_fitting(
        self, f0: Callable[..., float], f1: Callable[..., float] = ..., f2: Callable[..., float] = ...
    ) -> tuple[float, float, float]: ...

def main() -> None: ...
