# typed: strict
# frozen_string_literal: true

require_relative "../../../../global"
require "cask/config"

module Tapioca
  module Compilers
    class CaskConfig < Tapioca::Dsl::Compiler
      ConstantType = type_member { { fixed: Module } }

      sig { override.returns(T::Enumerable[Module]) }
      def self.gather_constants = [Cask::Config]

      sig { override.void }
      def decorate
        root.create_module("Cask") do |mod|
          mod.create_class("Config") do |klass|
            Cask::Config.defaults.each do |key, value|
              return_type = if key == :languages
                # :languages is a `LazyObject`, so it lazily evaluates to an
                # array of strings when a method is called on it.
                "T::Array[String]"
              elsif key.end_with?("?")
                "T::Boolean"
              else
                value.class.to_s
              end

              klass.create_method(key.to_s, return_type:, class_method: false)
            end
          end
        end
      end
    end
  end
end
