require 'uia/library/struct_attributes'

module Uia
  module Library
    class ValueInformation < FFI::ManagedStruct
      extend StructAttributes

      layout :is_read_only, :bool,
             :value, :string

      struct_attr [:read_only?, :is_read_only], :value

      def self.release(pointer)
        Library.release_value_info(pointer)
      end
    end

    class ToggleInformation < FFI::ManagedStruct
      layout :state, :string

      def state
        self[:state]
      end

      def self.release(pointer)
        Library.release_toggle_info(pointer)
      end
    end

    class SelectionInformation < FFI::ManagedStruct
      layout :can_multi_select, :bool,
             :is_selection_required, :bool

      def multi_select?
        self[:can_multi_select]
      end

      def selection_required?
        self[:is_selection_required]
      end

      def self.release(pointer)
        Library.release_selection_info(pointer)
      end
    end

    class SelectionItemInformation < FFI::ManagedStruct
      layout :is_selected, :bool,
             :container, ElementStruct.ptr

      def selected?
        self[:is_selected]
      end

      def container
        self[:container] unless self[:container].empty?
      end

      def self.release(pointer)
        Library.release_selection_item_info(pointer)
      end
    end

    class ExpandCollapseInformation < FFI::ManagedStruct
      layout :expand_collapse_state, :string

      def expand_collapse_state
        self[:expand_collapse_state]
      end

      def self.release(pointer)
        Library.release_expand_collapse_info(pointer)
      end
    end

    class WindowInformation < FFI::ManagedStruct
      extend StructAttributes

      layout :visual_state, :string,
             :interaction_state, :string,
             :can_minimize, :bool,
             :can_maximize, :bool,
             :is_modal, :bool,
             :is_topmost, :bool

      struct_attr :visual_state, [:can_minimize?, :can_minimize], [:can_maximize?, :can_maximize],
                  [:modal?, :is_modal], [:topmost?, :is_topmost], :interaction_state

      def self.release(pointer)
        Library.release_window_info(pointer)
      end
    end

    class TableInformation < FFI::ManagedStruct
      extend StructAttributes

      layout :row_count, :int,
             :column_count, :int

      struct_attr :row_count, :column_count

      def self.release(pointer)
        Library.release_table_info(pointer)
      end
    end

    class TableItemInformation < FFI::ManagedStruct
      extend StructAttributes

      layout :column, :int,
             :row, :int

      struct_attr :column, :row

      def self.release(pointer)
        Library.release_table_item_info(pointer)
      end
    end

    class RangeValueInformation < FFI::ManagedStruct
      extend StructAttributes

      layout :value, :double,
             :minimum, :double,
             :maximum, :double,
             :small_change, :double,
             :large_change, :double,
             :is_read_only, :bool

      struct_attr :value, :minimum, :maximum, :small_change, :large_change, [:read_only?, :is_read_only]

      def self.release(pointer)
        Library.release_range_value_info(pointer)
      end
    end
  end
end