# frozen_string_literal: true

module Axlsx
  # Selection options for worksheet panes.
  #
  # @note The recommended way to manage the selection pane options is via SheetView#add_selection
  # @see SheetView#add_selection
  class Selection
    include Axlsx::OptionsParser
    include Axlsx::SerializedAttributes

    # Creates a new {Selection} object
    # @option options [Cell, String] active_cell Active Cell Location
    # @option options [Integer] active_cell_id Active Cell Index
    # @option options [Symbol] pane Pane
    # @option options [String] sqref Sequence of References
    def initialize(options = {})
      @active_cell = @active_cell_id = @pane = @sqref = nil
      parse_options options
    end

    serializable_attributes :active_cell, :active_cell_id, :pane, :sqref
    # Active Cell Location
    # Location of the active cell.
    # @see type
    # @return [String]
    # default nil
    attr_reader :active_cell

    # Active Cell Index
    # 0-based index of the range reference (in the array of references listed in sqref)
    # containing the active cell. Only used when the selection in sqref is not contiguous.
    # Therefore, this value needs to be aware of the order in which the range references are
    # written in sqref.
    # When this value is out of range then activeCell can be used.
    # @see type
    # @return [Integer]
    # default nil
    attr_reader :active_cell_id

    # Pane
    # The pane to which this selection belongs.
    # Options are
    #  * bottom_left:  Bottom left pane, when both vertical and horizontal
    #                  splits are applied. This value is also used when only
    #                  a horizontal split has been applied, dividing the pane
    #                  into upper and lower regions. In that case, this value
    #                  specifies the bottom pane.
    #  * bottom_right: Bottom right pane, when both vertical and horizontal
    #                  splits are applied.
    #  * top_left:     Top left pane, when both vertical and horizontal splits
    #                  are applied. This value is also used when only a horizontal
    #                  split has been applied, dividing the pane into upper and lower
    #                  regions. In that case, this value specifies the top pane.
    #                  This value is also used when only a vertical split has
    #                  been applied, dividing the pane into right and left
    #                  regions. In that case, this value specifies the left pane
    #  * top_right:    Top right pane, when both vertical and horizontal
    #                  splits are applied. This value is also used when only
    #                  a vertical split has been applied, dividing the pane
    #                  into right and left regions. In that case, this value
    #                  specifies the right pane.
    # @see type
    # @return [Symbol]
    # default nil
    attr_reader :pane

    # Sequence of References
    # Range of the selection. Can be non-contiguous set of ranges.
    # @see type
    # @return [String]
    # default nil
    attr_reader :sqref

    # @see active_cell
    def active_cell=(v)
      cell = (v.instance_of?(Axlsx::Cell) ? v.r_abs : v)
      Axlsx.validate_string(cell)
      @active_cell = cell
    end

    # @see active_cell_id
    def active_cell_id=(v)
      Axlsx.validate_unsigned_int(v)
      @active_cell_id = v
    end

    # @see pane
    def pane=(v)
      Axlsx.validate_pane_type(v)
      @pane = Axlsx.camel(v, false)
    end

    # @see sqref
    def sqref=(v)
      Axlsx.validate_string(v)
      @sqref = v
    end

    # Serializes the data validation
    # @param [String] str
    # @return [String]
    def to_xml_string(str = +'')
      serialized_tag 'selection', str
    end
  end
end
