module Jxedt
    def self.config
        Jxedt::Config.instance
    end

    class Config 
        attr_accessor :dsl_config

        APPLICABLE_DSL_CONFIG = {
            :all_binary => '全部组件使用二进制。默认为false',
            :binary_dir => "二进制文件的保存路径,'Pods/Pods.xcodeproj'文件的相对路径。默认为'../_Prebuild'",
            :binary_switch => "插件开关,设置为false则关闭插件二进制功能。默认为true",
            :prebuild_job => "开启编译任务,设置为false则不触发编译功能。默认为true",
            :keep_source_project => "保留源码的pods工程,方便查看源码,文件目录为Podfile文件同级目录下'Pods-Source'。默认为false",
            :dev_pods_enabled => "Development Pods是否支持二进制。默认为false",
            :excluded_pods => "排除binary的pods,是一个数组。默认是[]",
            :xcconfig_configuration_alias => "xcconfig文件中配置多configuration的别名(一定要唯一),用于搜索替换,我们用来支持多configuration的二进制。一般不需要设置,默认值为'cocoapods-jxedt-binary'",
            :framework_header_search_enabled => "开启binary的组件是否配置HEADER_SEARCH_PATH头文件搜索,兼容头文件引用的问题。默认为false",
            :silent_build => "静默编译,即不输出编译命令。默认true",
            :configurations => "支持的configuration配置,可以写字符串'Debug'或'Release',也可以写多个'['Debug', 'Release']'。默认为'Release'",
            :xcframework => "编译结果是否为xcframework。默认false",
            :clean_build => "编译的时候是否clean build。默认true",
            :bitcode_enabled => "开启bitcode。默认false",
            :device_build_enabled => "编译真机架构。默认true",
            :simulator_build_enabled => "编译模拟器架构。默认false",
            :disable_dsym => "禁止DSYM产物。默认true",
            :disable_resource_compilable_pods => "禁止编译有特殊resource文件(xib、xcdatamodeld等)的pod。默认为false",
            :build_log_path => "编译的log输出路径。",
            :prebuild_sandbox_path => '预编译的sandbox(源码)路径,可以配置一个多台电脑都可访问的路径,做源码和二进制的link。必须以`/Users/cocoapods-jxedt`开头,否则插件认为无效。',
            :build_args => "编译的配置。了解xcodebuild命令的可以配置编译参数,例如配置 ARCHS='arm64 armv7'",
            :git_cache => 'git缓存配置。A Hash. 详情查看 GIT_CACHE_CONFIG'
        }.freeze

        GIT_CACHE_CONFIG = {
            :repo => '配置缓存仓库地址,如:{:remote => "https://github.com/user/cocoapods-cache.git", :local => "~/.cocoapods-jxedt/cocoapods-cache"},或者直接写远程仓库地址"https://github.com/user/cocoapods-cache.git"',
            :branch => 'git cache的branch,默认是master分支',
            :auto_fetch => '预编译过程是否自动拉取远程的二进制。默认true',
            :auto_push => '预编译过程是否自动同步二进制结果到远程。默认false'
        }.freeze
        
        def initialize()
            @dsl_config = {}
            @git_config = {}
        end
    
        def self.instance
          @instance ||= new()
        end

        def validate_dsl_config
            inapplicable_options = @dsl_config.keys - APPLICABLE_DSL_CONFIG.keys
            return if inapplicable_options.empty?
            
            message = <<~HEREDOC
              [WARNING] The following options (in `config_cocoapods_util`) are not correct: #{inapplicable_options}.
              Available options: #{APPLICABLE_DSL_CONFIG}.
            HEREDOC
      
            Pod::UI.puts message.yellow
        end

        def all_binary_enabled?
            @dsl_config[:all_binary] || false
        end

        def binary_switch?
            @dsl_config[:binary_switch] || @dsl_config[:binary_switch].nil?
        end

        def prebuild_job?
            @dsl_config[:prebuild_job] || @dsl_config[:prebuild_job].nil?
        end

        def keep_source_project?
            @dsl_config[:keep_source_project] || false
        end

        def dev_pods_enabled?
            @dsl_config[:dev_pods_enabled] || false
        end

        def excluded_pods
            @dsl_config[:excluded_pods] || []
        end

        def framework_header_search_enabled?
            @dsl_config[:framework_header_search_enabled] || false
        end

        def binary_dir
            @dsl_config[:binary_dir] || '../_Prebuild'
        end

        def xcconfig_configuration_alias
            @val ||= begin
                val = @dsl_config[:xcconfig_configuration_alias]
                val = "cocoapods-jxedt-binary" if val.nil? || val.empty?
                val
            end
        end

        def silent_build?
            @dsl_config[:silent_build] || @dsl_config[:silent_build].nil?
        end

        def xcframework?
            @dsl_config[:xcframework] || false
        end

        def clean_build?
            @dsl_config[:clean_build] || @dsl_config[:clean_build].nil?
        end

        def bitcode_enabled?
            @dsl_config[:bitcode_enabled] || false
        end

        def disable_dsym?
            @dsl_config[:disable_dsym] || @dsl_config[:disable_dsym].nil?
        end

        def disable_resource_compilable_pods?
            @dsl_config[:disable_resource_compilable_pods] || false
        end

        def device_build_enabled?
            @dsl_config[:device_build_enabled] || @dsl_config[:device_build_enabled].nil?
        end

        def simulator_build_enabled?
            @dsl_config[:simulator_build_enabled] || false
        end

        def build_log_path
            @dsl_config[:build_log_path]
        end

        def prebuild_sandbox_path
            @sandbox_path ||= begin
                sandbox_path = @dsl_config[:prebuild_sandbox_path]
                sandbox_path = nil unless sandbox_path =~ /^\/Users\/cocoapods-jxedt\/.{1,}$/
                sandbox_path = nil unless File.exist?('/Users/cocoapods-jxedt')
                sandbox_path
            end
        end

        def build_args
            @args ||= begin
                args = @dsl_config[:build_args] || {}
                # 可选的配置项
                default_options = []
                default_options << "ONLY_ACTIVE_ARCH=NO"
                default_options << "BUILD_LIBRARY_FOR_DISTRIBUTION=YES"
                args[:default] ||= default_options
                args[:device] ||= ["ARCHS='arm64'"] # ["ARCHS='arm64 armv7 armv7s'"]
                args[:simulator] ||= ["ARCHS='x86_64'"] # ["ARCHS='arm64 x86_64 i386'"]
                args
            end
        end

        def support_configurations
            @configurations ||= begin
                configurations = []
                user_config = @dsl_config[:configurations]
                configurations << user_config if user_config.is_a?(String)
                configurations += user_config if user_config.is_a?(Array)
                configurations = ["Release"] if configurations.empty?
                configurations
            end
        end

        # git配置 ======================================= git配置
        def git_cache_config
            @git_cache ||= @dsl_config[:git_cache] || {}
        end

        def cache_repo
            @cache_repo ||= begin
                cache_repo = {}
                user_config = git_cache_config[:repo]
                cache_repo[:remote] = user_config if user_config.is_a?(String)
                cache_repo.merge!(user_config) if user_config.is_a?(Hash)
                cache_repo
            end
        end

        def git_remote_repo
            @remote ||= cache_repo[:remote]
        end

        def cache_repo_enabled?
            remote = git_remote_repo
            remote && remote.is_a?(String) && remote =~ /.*\.git$/
        end

        def git_cache_path
            return nil unless cache_repo_enabled?

            local = cache_repo[:local]
            return File.expand_path(local) if local && local.is_a?(String) && local.split('/').size > 1

            remote = git_remote_repo
            repo_name = Pathname.new(remote).basename.sub_ext('').to_s
            File.expand_path("~/.cocoapods-jxedt/#{repo_name}")
        end

        def auto_fetch?
            git_cache_config[:auto_fetch] || git_cache_config[:auto_fetch].nil?
        end

        def auto_push?
            git_cache_config[:auto_push]
        end

        def cache_branch
            git_cache_config[:branch] || 'master'
        end
        # git配置 ======================================= git配置
    end
end