# ==========================================
# SPLIT ROWS
# ==========================================

import cv2
import os

IMAGE_FILE = r"G:\00. PROJECTS\API\Inventory\output\NamaBarang.jpg"

OUTPUT_DIR = r"G:\00. PROJECTS\API\Inventory\output\rows"

# ==========================================
# OUTPUT FOLDER
# ==========================================

os.makedirs(
    OUTPUT_DIR,
    exist_ok=True
)

# ==========================================
# LOAD IMAGE
# ==========================================

img = cv2.imread(IMAGE_FILE)

if img is None:

    print("ERROR : Gagal membuka gambar")
    exit()

# ==========================================
# GRAYSCALE
# ==========================================

gray = cv2.cvtColor(
    img,
    cv2.COLOR_BGR2GRAY
)

# ==========================================
# OTSU THRESHOLD
# ==========================================

_, thresh = cv2.threshold(
    gray,
    0,
    255,
    cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU
)

# ==========================================
# HORIZONTAL PROJECTION
# ==========================================

height, width = thresh.shape

rows = []

for y in range(height):

    count = cv2.countNonZero(
        thresh[y:y+1, :]
    )

    rows.append(count)

# ==========================================
# DETECT TEXT BLOCK
# ==========================================

inside = False
start_y = 0

row_ranges = []

for y, value in enumerate(rows):

    if value > 5 and not inside:

        start_y = y
        inside = True

    elif value <= 5 and inside:

        end_y = y

        if end_y - start_y > 5:

            row_ranges.append(
                (start_y, end_y)
            )

        inside = False

# ==========================================
# SKIP HEADER
# ==========================================

if len(row_ranges) > 0:

    row_ranges = row_ranges[1:]

# ==========================================
# SAVE ROWS
# ==========================================

print("")
print("===== ROWS =====")
print("")

for i, (y1, y2) in enumerate(
    row_ranges,
    start=1
):

    margin = 3

    top = max(
        0,
        y1 - margin
    )

    bottom = min(
        height,
        y2 + margin
    )

    row_img = img[
        top:bottom,
        :
    ]

    file_name = os.path.join(
        OUTPUT_DIR,
        f"row_{i:03d}.jpg"
    )

    cv2.imwrite(
        file_name,
        row_img
    )

    print(
        f"ROW {i:03d} : "
        f"Y={top}-{bottom}"
    )

print("")
print("SELESAI")