require 'fastlane_core'
require 'fastlane_core/configuration/config_item'

module Fastlane
  module BuildType
    RELEASE = "release" # AppStore or AdHoc
    DEBUG = "debug" # Development
    ALL = [RELEASE, DEBUG]
  end

  module BuildFlavor
    PROD = "prod"
    STAFF = "staff"
    ALL = [PROD, STAFF]
  end

  module BuildConfig
    def self.for(build_flavor)
      case build_flavor
      when BuildFlavor::PROD
        {
          project: "suno/suno.xcodeproj",
          scheme: "suno-production",
          target: "suno",
          app_identifier: "ai.suno.ios",
          google_services_plist: "suno/GoogleService-Info/Production/GoogleService-Info.plist",
          export_method: "app-store",
          code_sign_identity: "Apple Distribution: Suno Inc. (FSA297U4QJ)",
          entitlements: {
            "ai.suno.ios" => "suno-production.entitlements",
            "ai.suno.ios.sunoNotificationServiceExtension" => "sunoNotificationServiceExtension/sunoNotificationServiceExtension.entitlements"
          },
          provisioning_profiles: {
            "ai.suno.ios" => "match AppStore ai.suno.ios 1763503826",
            "ai.suno.ios.sunoNotificationServiceExtension" => "match AppStore ai.suno.ios.sunoNotificationServiceExtension 1763503826"
          },
          testing: {
            device: "iPhone 16 Pro (18.5)",
            deployment_target_version: "18.0",
            xcargs: %w[
              ONLY_ACTIVE_ARCH=YES
              COMPILER_INDEX_STORE_ENABLE=NO
              CODE_SIGNING_ALLOWED=NO
              SWIFT_SERIALIZE_DEBUGGING_OPTIONS=NO
              SWIFT_INDEX_STORE_ENABLE=NO
            ].join(" ")
          }
        }
      when BuildFlavor::STAFF
        {
          project: "suno/suno.xcodeproj",
          scheme: "suno-staff",
          target: "suno",
          app_identifier: "ai.suno.ios-staff",
          google_services_plist: "suno/GoogleService-Info/Staff/GoogleService-Info.plist",
          code_sign_identity: "Apple Distribution: Suno Inc. (FSA297U4QJ)",
          export_method: "ad-hoc",
          entitlements: {
            "ai.suno.ios-staff" => "suno-staff.entitlements",
            "ai.suno.ios-staff.sunoNotificationServiceExtension" => "sunoNotificationServiceExtension/sunoNotificationServiceExtension.entitlements"
          },
          provisioning_profiles: {
            "ai.suno.ios-staff" => "match AdHoc ai.suno.ios-staff 1763513311",
            "ai.suno.ios-staff.sunoNotificationServiceExtension" => "match AdHoc ai.suno.ios-staff.sunoNotificationServiceExtension 1763513311"
          }
        }
      end
    end

    # Default options from .env.default file
    def self.default_options
      [
          FastlaneCore::ConfigItem.new(
            key: :logs_dir,
            description: "Directory to save build logs",
            env_name: "BUILD_LOGS_DIR",
            verify_block: proc do |value|
              UI.user_error!("Build logs directory cannot be empty") unless !File.exist?(value) || File.directory?(value)
              FileUtils.mkdir_p(value)
            end
          ),
          FastlaneCore::ConfigItem.new(
            key: :output_dir,
            description: "Directory to save build outputs",
            env_name: "BUILD_OUTPUT_DIR",
            verify_block: proc do |value|
              UI.user_error!("Build output directory cannot be empty") unless !File.exist?(value) || File.directory?(value)
              FileUtils.mkdir_p(value)
            end
          ),
          FastlaneCore::ConfigItem.new(
            key: :source_packages_path,
            description: "Path to source packages",
            env_name: "SOURCE_PACKAGES_PATH",
            verify_block: proc do |value|
              UI.user_error!("Invalid source packages path") unless !File.exist?(value) || File.directory?(value)
              FileUtils.mkdir_p(value)
            end
          ),
          FastlaneCore::ConfigItem.new(
            key: :derived_data_path,
            description: "Path to derived data",
            env_name: "DERIVED_DATA_PATH",
            verify_block: proc do |value|
              UI.user_error!("Invalid derived data path") unless !File.exist?(value) || File.directory?(value)
              FileUtils.mkdir_p(value)
            end
          ),
          FastlaneCore::ConfigItem.new(
            key: :formatter,
            description: "Path to derived data",
            env_name: "FASTLANE_XCODEBUILD_FORMATTER",
            verify_block: proc do |value|
              UI.user_error!("Invalid derived data path") if value.empty?
            end
          ),
        ]
    end
  end
end
