defmodule ComponentsElixir.QRCode do @moduledoc """ QR Code generation and parsing for storage locations. Provides functionality to generate QR codes for storage locations and parse them back to retrieve location information. """ @doc """ Generates a QR code data string for a storage location. Format: SL:{level}:{qr_code}:{parent_qr_or_ROOT} ## Examples iex> location = %StorageLocation{level: 1, qr_code: "ABC123", parent: nil} iex> ComponentsElixir.QRCode.generate_qr_data(location) "SL:1:ABC123:ROOT" iex> parent = %StorageLocation{qr_code: "SHELF1"} iex> drawer = %StorageLocation{level: 2, qr_code: "DRAW01", parent: parent} iex> ComponentsElixir.QRCode.generate_qr_data(drawer) "SL:2:DRAW01:SHELF1" """ def generate_qr_data(storage_location) do parent_code = case storage_location.parent do nil -> "ROOT" parent -> parent.qr_code end "SL:#{storage_location.level}:#{storage_location.qr_code}:#{parent_code}" end @doc """ Parses a QR code string and extracts components. ## Examples iex> ComponentsElixir.QRCode.parse_qr_data("SL:1:ABC123:ROOT") {:ok, %{level: 1, code: "ABC123", parent: "ROOT"}} iex> ComponentsElixir.QRCode.parse_qr_data("invalid") {:error, :invalid_format} """ def parse_qr_data(qr_string) do case String.split(qr_string, ":") do ["SL", level_str, code, parent] -> case Integer.parse(level_str) do {level, ""} -> {:ok, %{level: level, code: code, parent: parent}} _ -> {:error, :invalid_level} end _ -> {:error, :invalid_format} end end @doc """ Validates if a string looks like a storage location QR code. ## Examples iex> ComponentsElixir.QRCode.valid_storage_qr?("SL:1:ABC123:ROOT") true iex> ComponentsElixir.QRCode.valid_storage_qr?("COMP:12345") false """ def valid_storage_qr?(qr_string) do case parse_qr_data(qr_string) do {:ok, _} -> true _ -> false end end @doc """ Generates a printable label data structure for a storage location. This could be used to generate PDF labels or send to a label printer. """ def generate_label_data(storage_location) do qr_data = generate_qr_data(storage_location) %{ qr_code: qr_data, name: storage_location.name, path: storage_location.path, level: storage_location.level, description: storage_location.description } end @doc """ Generates multiple QR codes for disambiguation testing. This is useful for testing multi-QR detection scenarios. """ def generate_test_codes(storage_locations) when is_list(storage_locations) do Enum.map(storage_locations, &generate_qr_data/1) end end