module Watir
  module Locators
    class TextField
      class SelectorBuilder
        class XPath < Element::SelectorBuilder::XPath
          def text_string
            return super if @adjacent

            @built[:text] = @selector.delete(:text) if @selector.key?(:text)
            ''
          end

          def additional_string
            return '' if @adjacent

            type_string(@selector.delete(:type))
          end

          def tag_string
            @selector[:tag_name] = 'input' unless @adjacent
            super
          end

          def type_string(type)
            if type.eql?(true)
              "[#{negative_type_text}]"
            elsif Watir::TextField::NON_TEXT_TYPES.include?(type)
              msg = "TextField Elements can not be located by type: #{type}"
              raise LocatorException, msg
            elsif type.nil?
              "[not(@type) or (#{negative_type_text})]"
            else
              "[#{process_attribute(:type, type)}]"
            end
          end

          def negative_type_text
            Watir::TextField::NON_TEXT_TYPES.map { |type|
              lhs = lhs_for(:type, downcase: true)
              rhs = SelectorBuilder::XpathSupport.downcase(SelectorBuilder::XpathSupport.escape(type))
              "#{lhs}!=#{rhs}"
            }.join(' and ')
          end
        end
      end
    end
  end
end
