# typed: true
# frozen_string_literal: true

require('cli/ui')

module CLI
  module UI
    module Widgets
      class Base
        extend T::Sig
        extend T::Helpers
        abstract!

        class << self
          extend T::Sig

          sig { params(argstring: String).returns(String) }
          def call(argstring)
            new(argstring).render
          end
        end

        sig { params(argstring: String).void }
        def initialize(argstring)
          pat = self.class.argparse_pattern
          unless (@match_data = pat.match(argstring))
            raise(Widgets::InvalidWidgetArguments.new(argstring, pat))
          end

          @match_data.names.each do |name|
            instance_variable_set(:"@#{name}", @match_data[name])
          end
        end

        class << self
          extend T::Sig

          sig { abstract.returns(Regexp) }
          def argparse_pattern; end
        end

        sig { abstract.returns(String) }
        def render; end
      end
    end
  end
end