import abc
import numpy as np
from .base import LikeProperty, Operation, Property, PropertySequence
from abc import abstractmethod
from typing import Callable, Union

class Point(Property):
    def __init__(self, point: PropertySequence) -> None: ...
    def get(self) -> np.ndarray: ...
LikePoint = Union[Point, PropertySequence, np.ndarray]

class PointOperation(Operation, metaclass=abc.ABCMeta):
    def __call__(self, **params) -> Callable[[LikePoint], Point]: ...
    @abstractmethod
    def operation(self, obj: np.ndarray, **params) -> np.ndarray: ...

class PointShift(PointOperation):
    def __init__(self, shift: LikePoint) -> None: ...
    def __call__(self) -> Callable[[LikePoint], Point]: ...
    def operation(self, obj: np.ndarray, shift: np.ndarray) -> np.ndarray: ...

class PointRotate(PointOperation):
    def __init__(self, angle: LikeProperty, pivot: LikePoint = ...) -> None: ...
    def __call__(self, pivot: LikePoint = ...) -> Callable[[LikePoint], Point]: ...
    def operation(self, obj: np.ndarray, pivot: np.ndarray, angle: np.ndarray) -> np.ndarray: ...

class PointInflation(PointOperation):
    def __init__(self, factor: LikeProperty, pivot: LikePoint = ...) -> None: ...
    def __call__(self, pivot: LikePoint = ...) -> Callable[[LikePoint], Point]: ...
    def operation(self, obj: np.ndarray, pivot: np.ndarray, factor: np.ndarray) -> np.ndarray: ...
