const std = @import("std");
const basic_models = @import("basic_models.zig");
const Point2_f = basic_models.Point2_f;
const Scale2_f = basic_models.Scale2_f;
const Size_f = basic_models.Size_f;
const Radii_f = basic_models.Radii_f;

pub const Data = union(enum) {
    position: Point2_f,
    angle: f32,
    scale: Scale2_f,
    visible: bool,
    opacity: f32,
    locked: bool,

    size: Size_f,
    radii: Radii_f,
    /// Процент дуги эллипса: 100 — полный эллипс, 50 — полуэллипс (0..100).
    arc_percent: f32,
    end_point: Point2_f,

    /// Владеет памятью; при deinit/clone — free/duplicate.
    points: []const Point2_f,
    /// Замкнутый контур (для ломаной: отрезок последняя–первая точка + заливка).
    closed: bool,

    /// Включена ли заливка.
    filled: bool,

    /// Цвет заливки, 0xRRGGBBAA.
    fill_rgba: u32,
    /// Цвет обводки, 0xRRGGBBAA.
    stroke_rgba: u32,

    thickness: f32,
};

pub const Property = struct {
    data: Data,

    pub fn deinit(self: *Property, allocator: std.mem.Allocator) void {
        switch (self.data) {
            .points => |slice| allocator.free(slice),
            else => {},
        }
        self.* = undefined;
    }

    pub fn clone(self: Property, allocator: std.mem.Allocator) !Property {
        return switch (self.data) {
            .points => |slice| .{
                .data = .{
                    .points = blk: {
                        const copy = try allocator.dupe(Point2_f, slice);
                        break :blk copy;
                    },
                },
            },
            else => .{ .data = self.data },
        };
    }
};
