# frozen_string_literal: true

module Axlsx
  # CellAlignment stores information about the cell alignment of a style Xf Object.
  # @note Using Styles#add_style is the recommended way to manage cell alignment.
  # @see Styles#add_style
  class CellAlignment
    include Axlsx::SerializedAttributes
    include Axlsx::OptionsParser

    serializable_attributes :horizontal, :vertical, :text_rotation, :wrap_text, :indent, :relative_indent, :justify_last_line, :shrink_to_fit, :reading_order
    # Create a new cell_alignment object
    # @option options [Symbol] horizontal
    # @option options [Symbol] vertical
    # @option options [Integer] text_rotation
    # @option options [Boolean] wrap_text
    # @option options [Integer] indent
    # @option options [Integer] relative_indent
    # @option options [Boolean] justify_last_line
    # @option options [Boolean] shrink_to_fit
    # @option options [Integer] reading_order
    def initialize(options = {})
      parse_options options
    end

    # The horizontal alignment of the cell.
    # @note
    #  The horizontal cell alignment style must be one of
    #   :general
    #   :left
    #   :center
    #   :right
    #   :fill
    #   :justify
    #   :centerContinuous
    #   :distributed
    # @return [Symbol]
    attr_reader :horizontal

    # The vertical alignment of the cell.
    # @note
    #  The vertical cell allingment style must be one of the following:
    #   :top
    #   :center
    #   :bottom
    #   :justify
    #   :distributed
    # @return [Symbol]
    attr_reader :vertical

    # The textRotation of the cell.
    # @return [Integer]
    attr_reader :text_rotation
    alias :textRotation :text_rotation

    # Indicate if the text of the cell should wrap
    # @return [Boolean]
    attr_reader :wrap_text
    alias :wrapText :wrap_text

    # The amount of indent
    # @return [Integer]
    attr_reader :indent

    # The amount of relativeIndent
    # @return [Integer]
    attr_reader :relative_indent
    alias :relativeIndent :relative_indent

    # Indicate if the last line should be justified.
    # @return [Boolean]
    attr_reader :justify_last_line
    alias :justifyLastLine :justify_last_line

    # Indicate if the text should be shrunk to the fit in the cell.
    # @return [Boolean]
    attr_reader :shrink_to_fit
    alias :shrinkToFit :shrink_to_fit

    # The reading order of the text
    # 0 Context Dependent
    # 1 Left-to-Right
    # 2 Right-to-Left
    # @return [Integer]
    attr_reader :reading_order
    alias :readingOrder :reading_order

    # @see horizontal
    def horizontal=(v)
      Axlsx.validate_horizontal_alignment v
      @horizontal = v
    end

    # @see vertical
    def vertical=(v)
      Axlsx.validate_vertical_alignment v
      @vertical = v
    end

    # @see textRotation
    def text_rotation=(v)
      Axlsx.validate_unsigned_int v
      @text_rotation = v
    end
    alias :textRotation= :text_rotation=

    # @see wrapText
    def wrap_text=(v)
      Axlsx.validate_boolean v
      @wrap_text = v
    end
    alias :wrapText= :wrap_text=

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

    # @see relativeIndent
    def relative_indent=(v)
      Axlsx.validate_int v
      @relative_indent = v
    end
    alias :relativeIndent= :relative_indent=

    # @see justifyLastLine
    def justify_last_line=(v)
      Axlsx.validate_boolean v
      @justify_last_line = v
    end
    alias :justifyLastLine= :justify_last_line=

    # @see shrinkToFit
    def shrink_to_fit=(v)
      Axlsx.validate_boolean v
      @shrink_to_fit = v
    end
    alias :shrinkToFit= :shrink_to_fit=

    # @see readingOrder
    def reading_order=(v)
      Axlsx.validate_unsigned_int v
      @reading_order = v
    end
    alias :readingOrder= :reading_order=

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