import os

import cv2
import cv2 as cv
import os

class Obraz:
    def __init__(self, filename:str, mode:int = cv.IMREAD_COLOR_BGR):
        self.filename = filename
        self.mode = mode
        self.loaded = False
        self.img = None
        self.img_other = None
        self.transform_name = "NOTHING"

    def load_image(self):
        if self.loaded:
            return True
        if not os.path.exists(self.filename):
            return False
            # raise FileNotFoundError(self.filename)
        try:
            self.img = cv.imread(self.filename, flags=self.mode)
            self.loaded = True
        except Exception as e:
            print(e)

        return True

    def show_image(self, window_name:str="Window"):
        if not self.loaded:
            return False
        window_name += f" - {self.filename}"
        cv.imshow(window_name, self.img)
        cv.waitKey(0)
        cv.destroyAllWindows()
        return None

    def show_image_other(self, window_name:str="Window after "):
        if not self.loaded:
            return False
        if self.img_other is None:
            return False
        window_name += f" - {self.filename} - {self.transform_name}"
        combined = cv.hconcat([self.img, self.img_other])
        cv.imshow(window_name, combined)
        cv.waitKey(0)
        cv.destroyAllWindows()
        return None

    def transform_equalize_histogram(self):
        if not self.loaded:
            return False
        if self.mode == cv.IMREAD_COLOR or self.mode == cv.IMREAD_COLOR_BGR:
            gray_image = cv2.cvtColor(self.img, cv2.COLOR_BGR2GRAY)
        self.img_other = cv.equalizeHist(gray_image)
        self.transform_name = "Equalize Histogram"
        return True

    def transform_smoothing(self, smoothing_type="GaussianBlur"):
        """

        :param smoothing_type: GaussianBlur (default) or medianBlur
        :return: True or False
        """
        if not self.loaded:
            return False
        try:
            if smoothing_type == "GaussianBlur":
                self.img_other = cv.GaussianBlur(self.img, (5, 5), 0)
            else:
                self.img_other = cv.medianBlur(self.img, 5)
            self.transform_name = smoothing_type
            return True
        except Exception as e:
            print(e)
            return False

    def return_image_stream(self, type:str="other"):
        """

        :param type: other | original
        :return:
        """
        if not self.loaded:
            return None
        if type == "original":
            return self.img
        elif type == "other":
            if self.img_other is None:
                return None
            return self.img_other
        else:
            return None
