import cv2
import numpy as np

# =====================
# CONFIGURATION
# =====================
CAMERA_INDEX = 0  # <-- change this if you want another camera (0,1,2,...)

def nothing(x):
    pass

def get_mask(frame, hsv_ranges):
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    lower = np.array([hsv_ranges["H Min"], hsv_ranges["S Min"], hsv_ranges["V Min"]])
    upper = np.array([hsv_ranges["H Max"], hsv_ranges["S Max"], hsv_ranges["V Max"]])
    mask = cv2.inRange(hsv, lower, upper)
    return mask

def get_contour_info(mask, frame):
    contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    if not contours:
        return frame, None

    c = max(contours, key=cv2.contourArea)
    if cv2.contourArea(c) < 500:
        return frame, None

    cv2.drawContours(frame, [c], -1, (0, 0, 255), 3)

    x_vals = c[:, 0, 0]
    y_vals = c[:, 0, 1]
    w_px = max(x_vals) - min(x_vals)
    h_px = max(y_vals) - min(y_vals)

    if w_px == 0 or h_px == 0:
        return frame, None

    oar = round(float(w_px) / h_px, 2)
    return frame, oar

# =====================
# MAIN PROGRAM
# =====================

cap = cv2.VideoCapture(CAMERA_INDEX)  # Use the configured camera index

# Create HSV trackbars
cv2.namedWindow("Trackbars")
for name, maxval, initval in [
    ("H Min", 179, 0), ("S Min", 255, 0), ("V Min", 255, 0),
    ("H Max", 179, 179), ("S Max", 255, 255), ("V Max", 255, 255)
]:
    cv2.createTrackbar(name, "Trackbars", initval, maxval, nothing)

while True:
    ret, frame = cap.read()
    if not ret:
        break

    hsv_ranges = {name: cv2.getTrackbarPos(name, "Trackbars") for name in
                  ["H Min", "S Min", "V Min", "H Max", "S Max", "V Max"]}

    mask = get_mask(frame, hsv_ranges)
    result, oar = get_contour_info(mask, frame.copy())

    # ==========================
    # CLEAR IF / ELIF BLOCK
    # ==========================
    if oar is None:
        shape = "No object"
    elif oar >= 1:
        shape = "Square"
    elif oar <= 1:
        shape = "Rectangle"
    # ==========================

    if oar:
        cv2.putText(result, f"OAR={oar}", (30, 50),
                    cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
    cv2.putText(result, shape, (30, 90),
                cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)

    cv2.imshow("Original", frame)
    cv2.imshow("Mask", mask)
    cv2.imshow("Result", result)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
