#!/usr/bin/env python3
# -*- coding: utf-8 -*-
__author__ = "heider"
__doc__ = r"""
           Created on 5/5/22
           """
from pathlib import Path
import cv2
from draugr.opencv_utilities import add_trackbar, show_image
__all__ = ["hough_circle_calibrator"]
[docs]def hough_circle_calibrator(
    frame,
) -> None:  # TODO: GENERALISE INTERACTIVE CALIBRATOR TO MANY MORE OPENCV FUNCTIONS
    """description"""
    a_key_pressed = None  # .init
    edges = None
    lo_label = "Lo_Threshold"
    lo = 127
    lo_prev = -1
    hi_label = "Hi_Threshold"
    hi = 255
    hi_prev = -1
    dp_label = "dp"
    dp = 1
    dp_prev = -1
    min_distance_label = "min_distance"
    min_distance = 10
    min_distance_prev = -1
    param1_label = "param1"
    param1 = 255
    param1_prev = -1
    param2_label = "param2"
    param2 = 20
    param2_prev = -1
    min_radius_label = "min_radius"
    min_radius = 10
    min_radius_prev = -1
    max_radius_label = "max_radius"
    max_radius = 30
    max_radius_prev = -1
    frame_window_label = "Frame"
    canny_frame_window_label = f"{frame_window_label}.Canny"
    canny_hough_circle_window_label = f"{canny_frame_window_label}.Circles"
    show_image(frame, frame_window_label)
    show_image(frame, canny_frame_window_label)
    add_trackbar(canny_frame_window_label, lo_label, default=lo, max_val=1000)
    add_trackbar(canny_frame_window_label, hi_label, default=hi, max_val=1000)
    show_image(frame, canny_hough_circle_window_label)
    add_trackbar(
        canny_hough_circle_window_label, dp_label, default=dp, min_val=1, max_val=20
    )
    add_trackbar(
        canny_hough_circle_window_label,
        min_distance_label,
        default=min_distance,
        min_val=1,
        max_val=1000,
    )
    add_trackbar(
        canny_hough_circle_window_label,
        param1_label,
        default=param1,
        min_val=1,  # Zero is not a valid value for this parameter
    )
    add_trackbar(
        canny_hough_circle_window_label,
        param2_label,
        default=param2,
        min_val=1,  # Zero is not a valid value for this parameter
    )
    add_trackbar(
        canny_hough_circle_window_label, min_radius_label, default=min_radius, min_val=1
    )
    add_trackbar(
        canny_hough_circle_window_label, max_radius_label, default=max_radius, min_val=1
    )
    print(
        " --------------------------------------------------------------------------- press [ESC] to exit "
    )
    while True:
        if a_key_pressed == 27:
            break
        lo = cv2.getTrackbarPos(lo_label, canny_frame_window_label)
        hi = cv2.getTrackbarPos(hi_label, canny_frame_window_label)
        if lo != lo_prev or hi != hi_prev:  # --------------------------= RE-SYNC
            a_canny_refresh_flag = True  # --------------------------= FLAG
            lo_prev = lo
            hi_prev = hi
        else:
            a_canny_refresh_flag = False  # --------------------------= Un-FLAG
        dp = cv2.getTrackbarPos(dp_label, canny_hough_circle_window_label)
        min_distance = cv2.getTrackbarPos(
            min_distance_label, canny_hough_circle_window_label
        )
        param1 = cv2.getTrackbarPos(param1_label, canny_hough_circle_window_label)
        param2 = cv2.getTrackbarPos(param2_label, canny_hough_circle_window_label)
        min_radius = cv2.getTrackbarPos(
            min_radius_label, canny_hough_circle_window_label
        )
        max_radius = cv2.getTrackbarPos(
            max_radius_label, canny_hough_circle_window_label
        )
        if (
            dp != dp_prev
            or min_distance != min_distance_prev
            or param1 != param1_prev
            or param2 != param2_prev
            or min_radius != min_radius_prev
            or max_radius != max_radius_prev
        ):  # ----------------------------------------------= RE-SYNC
            a_hough_refresh_flag = True  # --------------------------= FLAG
            dp_prev = dp
            min_distance_prev = min_distance
            param1_prev = param1
            param2_prev = param2
            min_radius_prev = min_radius
            max_radius_prev = max_radius
        else:
            a_hough_refresh_flag = False  # --------------------------= Un-FLAG
        if (
            a_canny_refresh_flag
        ):  # REFRESH-process-pipe-line ( with recent <state> <vars> )
            edges = cv2.Canny(frame, lo, hi)
            cv2.imshow(canny_frame_window_label, edges)
        if a_canny_refresh_flag or a_hough_refresh_flag:
            circles = cv2.HoughCircles(
                edges,
                cv2.HOUGH_GRADIENT,
                dp=dp,
                minDist=min_distance,
                param1=param1,
                param2=param2,
                minRadius=min_radius,
                maxRadius=max_radius,
            )
            demo_with_circles = cv2.cvtColor(
                frame, cv2.COLOR_BGR2RGB
            )  # .re-init <<< src
            demo_with_circles = cv2.cvtColor(demo_with_circles, cv2.COLOR_RGB2BGR)
            if circles is not None:
                for c in circles[0]:
                    cv2.circle(
                        demo_with_circles,
                        (int(c[0]), int(c[1])),
                        int(c[2]),
                        (0, 255, 0),
                        1,
                    )
            cv2.imshow(canny_hough_circle_window_label, demo_with_circles)
        a_key_pressed = cv2.waitKey(1) & 0xFF
    cv2.destroyWindow(frame_window_label)
    cv2.destroyWindow(canny_frame_window_label)
    cv2.destroyWindow(canny_hough_circle_window_label) 
    # cv2.destroyAllWindows()
if __name__ == "__main__":
    def ijasd():
        """description"""
        from draugr.opencv_utilities import clean_up
        orig = cv2.imread(
            str(Path(r"C:\Users\Christian\OneDrive\Billeder\buh\7BIsT.png"))
        )[:800, :800, :]
        cleaned = clean_up(orig)
        hough_circle_calibrator(cleaned)
        ijasd()