#!/usr/bin/env python3
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyright (C) 2026 jondale

import sys
from pathlib import Path

deps_dir = Path(__file__).parent / "deps"
if deps_dir.exists() and str(deps_dir) not in sys.path:
    sys.path.insert(0, str(deps_dir))

import inkex
from inkex import PathElement, Transform


def create_living_hinge_pattern(svg, hinge_length, hinge_gap, hinge_spacing, width, height,
                                offset_x, offset_y, cut_style, tab_positions=None, segment_start=0):
    hinges = []
    x_pos = hinge_spacing / 2
    col = 0

    while x_pos < width:
        y_start = hinge_gap if col % 2 == 0 else hinge_gap + hinge_length / 2

        if col % 2 == 0:
            top_cut_end = hinge_gap
            top_cut_start = max(0, top_cut_end - hinge_length)
        else:
            top_cut_end = hinge_gap + hinge_length / 2 - hinge_spacing
            top_cut_start = max(0, top_cut_end - hinge_length)

        if top_cut_start < top_cut_end and top_cut_end > 0:
            hinge_path_data = f"M {x_pos},{top_cut_start} L {x_pos},{top_cut_end}"
            hinge = PathElement()
            hinge.set_id(svg.get_unique_id(f"hinge_{col}_top"))
            hinge.set('d', hinge_path_data)
            hinge.style = cut_style
            hinge.transform = inkex.Transform(translate=(offset_x, offset_y))
            hinges.append(hinge)

        y_pos = y_start
        cut_index = 0
        while y_pos + hinge_length <= height - hinge_gap:
            hinge_abs_start = segment_start + x_pos
            hinge_abs_end = segment_start + x_pos

            hinge_path_data = f"M {x_pos},{y_pos} L {x_pos},{y_pos + hinge_length}"

            hinge = PathElement()
            hinge.set_id(svg.get_unique_id(f"hinge_{col}_{cut_index}"))
            hinge.set('d', hinge_path_data)
            hinge.style = cut_style
            hinge.transform = inkex.Transform(translate=(offset_x, offset_y))
            hinges.append(hinge)

            y_pos += hinge_length + hinge_spacing
            cut_index += 1

        bottom_cut_start = y_pos
        bottom_cut_end = min(height, bottom_cut_start + hinge_length)

        if bottom_cut_start < height and bottom_cut_end > bottom_cut_start:
            hinge_path_data = f"M {x_pos},{bottom_cut_start} L {x_pos},{bottom_cut_end}"
            hinge = PathElement()
            hinge.set_id(svg.get_unique_id(f"hinge_{col}_bottom"))
            hinge.set('d', hinge_path_data)
            hinge.style = cut_style
            hinge.transform = inkex.Transform(translate=(offset_x, offset_y))
            hinges.append(hinge)

        x_pos += hinge_spacing
        col += 1

    return hinges


def detect_straight_segments(inset_path_d, min_straight_length, svg, units):
    path = inkex.Path(inset_path_d)
    csp = path.to_superpath()

    min_length_uu = svg.unittouu(f"{min_straight_length}{units}")

    straight_segments = []
    current_distance = 0.0

    for subpath in csp:
        for i, seg in enumerate(subpath[:-1]):
            next_seg = subpath[i + 1]
            bezier = (seg[1], seg[2], next_seg[0], next_seg[1])
            seg_length = inkex.bezier.bezierlength(bezier)

            if seg_length >= min_length_uu:
                straight_segments.append((current_distance, current_distance + seg_length))

            current_distance += seg_length

    return straight_segments
