from vergeml.img import ImageType
from vergeml.operation import OperationPlugin, operation
from vergeml.option import option
from PIL import Image
from vergeml.utils import VergeMLError

@operation('flip-vertical', topic="image", descr="Vertically flip and image.")
@option('chance', validate='>=0, <=1', default=1.)
class FlipVerticalOperation(OperationPlugin):

    def __init__(self, chance:float=1.0, apply=None):
        super().__init__(apply)
        self.chance = chance
    

    def transform_xy(self, x, y, rng):
      
        if rng.uniform(0.0, 1.0) < self.chance:

            x = x if not isinstance(x, ImageType) else x.transpose(Image.FLIP_TOP_BOTTOM)
            y = y if not isinstance(y, ImageType) else y.transpose(Image.FLIP_TOP_BOTTOM)
            
        return x, y