#!/usr/bin/env ruby
# frozen_string_literal: true

require 'optparse'

# Usage:
#   scripts/bump_version <new_version> [--ios=IOS_VERSION] [--android=ANDROID_VERSION]
#
# Examples:
#   scripts/bump_version 1.36.0
#   scripts/bump_version 1.36.0 --ios=1.34.0
#   scripts/bump_version 1.36.0 --android=1.35.0
#   scripts/bump_version 1.36.0 --ios=1.34.0 --android=1.35.0

options = {}
parser = OptionParser.new do |opts|
  opts.banner = "Usage: #{$PROGRAM_NAME} <new_version> [options]"
  opts.on("--ios=VERSION", "Override iOS version") do |v|
    options[:ios] = v
  end
  opts.on("--android=VERSION", "Override Android version") do |v|
    options[:android] = v
  end
end

parser.parse!
abort parser.help if ARGV.empty?

new_version = ARGV[0]
ios_version = options[:ios] || new_version
android_version = options[:android] || new_version
android_version_code = new_version.gsub(/\.(\d{1})(?!\d)/, '0$1').gsub(/\D/, '')

PATTERNS = [
  {
    file: "demo/plugins/cordova-idensic-mobile-sdk-plugin/src/android/build-extras.gradle",
    platform: :android,
    pattern: /(implementation "com\.sumsub\.sns:idensic-mobile-sdk(-videoident|-eid|-nfc)?:)([\d.]+)(")/,
    replacement: ->(match, ver) {
      "#{Regexp.last_match(1)}#{ver}#{Regexp.last_match(4)}"
    }
  },
  {
    file: "demo/platforms/android/cordova-idensic-mobile-sdk-plugin/SumSubCordova-build-extras.gradle",
    platform: :android,
    pattern: /(implementation "com\.sumsub\.sns:idensic-mobile-sdk(-videoident|-eid|-nfc)?:)([\d.]+)(")/,
    replacement: ->(match, ver) {
      "#{Regexp.last_match(1)}#{ver}#{Regexp.last_match(4)}"
    }
  },
  {
    file: "src/android/build-extras.gradle",
    platform: :android,
    pattern: /(implementation "com\.sumsub\.sns:idensic-mobile-sdk(-videoident|-eid|-nfc)?:)([\d.]+)(")/,
    replacement: ->(match, ver) {
      "#{Regexp.last_match(1)}#{ver}#{Regexp.last_match(4)}"
    }
  },
  {
    file: "demo/platforms/ios/SumSubCordova.xcodeproj/project.pbxproj",
    platform: :all,
    pattern: /(\s*MARKETING_VERSION\s*=\s*)([\d.]+)(;)/,
    replacement: ->(match, ver) {
      "#{Regexp.last_match(1)}#{ver}#{Regexp.last_match(3)}"
    }
  },
  {
    file: "demo/platforms/ios/SumSubCordova.xcodeproj/project.pbxproj",
    platform: :all,
    pattern: /(\s*CURRENT_PROJECT_VERSION\s*=\s*)([\d.]+)(;)/,
    replacement: ->(match, ver) {
      "#{Regexp.last_match(1)}#{ver}#{Regexp.last_match(3)}"
    }
  },
  {
    file: "demo/platforms/android/android.json",
    platform: :all,
    pattern: /(\s*"cordova-idensic-mobile-sdk-plugin"\s*:\s*")([\d.]+)(",?)/,
    replacement: ->(match, ver) {
      "#{Regexp.last_match(1)}#{ver}#{Regexp.last_match(3)}"
    }
  },
  {
    file: "demo/platforms/ios/platform_www/cordova_plugins.js",
    platform: :all,
    pattern: /(\s*"cordova-idensic-mobile-sdk-plugin"\s*:\s*")([\d.]+)(")/,
    replacement: ->(match, ver) {
      "#{Regexp.last_match(1)}#{ver}#{Regexp.last_match(3)}"
    }
  },
  {
    file: "demo/platforms/android/platform_www/cordova_plugins.js",
    platform: :all,
    pattern: /(\s*"cordova-idensic-mobile-sdk-plugin"\s*:\s*")([\d.]+)(")/,
    replacement: ->(match, ver) {
      "#{Regexp.last_match(1)}#{ver}#{Regexp.last_match(3)}"
    }
  },
  {
    file: "demo/plugins/cordova-idensic-mobile-sdk-plugin/package.json",
    platform: :all,
    pattern: /(\s*"version"\s*:\s*")([\d.]+)(")/,
    replacement: ->(match, ver) {
      "#{Regexp.last_match(1)}#{ver}#{Regexp.last_match(3)}"
    }
  },
  {
    file: "demo/package.json",
    platform: :all,
    pattern: /(\s*"version"\s*:\s*")([\d.]+)(",)/,
    replacement: ->(match, ver) {
      "#{Regexp.last_match(1)}#{ver}#{Regexp.last_match(3)}"
    }
  },
  {
    file: "package.json",
    platform: :all,
    pattern: /(\s*"version"\s*:\s*")([\d.]+)(",)/,
    replacement: ->(match, ver) {
      "#{Regexp.last_match(1)}#{ver}#{Regexp.last_match(3)}"
    }
  },
  {
    file: "demo/platforms/ios/pods.json",
    platform: :ios,
    pattern: /(\s*"spec"\s*:\s*"=)([\d.]+)(",)/,
    replacement: ->(match, ver) {
      "#{Regexp.last_match(1)}#{ver}#{Regexp.last_match(3)}"
    }
  },
  {
    file: "demo/platforms/ios/ios.json",
    platform: :all,
    pattern: /(\s*"cordova-idensic-mobile-sdk-plugin"\s*:\s*"=?)([\d.]+)(")/,
    replacement: ->(match, ver) {
      "#{Regexp.last_match(1)}#{ver}#{Regexp.last_match(3)}"
    }
  },
  {
    file: "demo/platforms/ios/Podfile",
    platform: :ios,
    pattern: /(pod.*', '=)([\d.]+)(')/,
    replacement: ->(match, ver) {
      "#{Regexp.last_match(1)}#{ver}#{Regexp.last_match(3)}"
    }
  },
  {
    file: "demo/config.xml",
    platform: :all,
    pattern: /(<widget .*version=")([\d.]+)(")/,
    replacement: ->(match, ver) {
      "#{Regexp.last_match(1)}#{ver}#{Regexp.last_match(3)}"
    }
  },
  {
    file: "plugin.xml",
    platform: :ios,
    pattern: /(<pod name="IdensicMobileSDK" spec="=)([\d.]+)(")/,
    replacement: ->(match, ver) {
      "#{Regexp.last_match(1)}#{ver}#{Regexp.last_match(3)}"
    }
  },
  {
    file: "demo/platforms/android/app/src/main/AndroidManifest.xml",
    platform: :all,
    pattern: /(android:versionName=")([\d.]+)(")/,
    replacement: ->(match, ver) {
      "#{Regexp.last_match(1)}#{ver}#{Regexp.last_match(3)}"
    }
  },
  {
    file: "plugin.xml",
    platform: :all,
    pattern: /(<plugin.*?version=")([\d.]+)(")/,
    replacement: ->(match, ver) {
      "#{Regexp.last_match(1)}#{ver}#{Regexp.last_match(3)}"
    }
  },  
  {
    file: "demo/plugins/cordova-idensic-mobile-sdk-plugin/plugin.xml",
    platform: :all,
    pattern: /(plugin.*?version=")([\d.]+)(")/,
    replacement: ->(match, ver) {
      "#{Regexp.last_match(1)}#{ver}#{Regexp.last_match(3)}"
    }
  },
  {
    file: "demo/plugins/cordova-idensic-mobile-sdk-plugin/plugin.xml",
    platform: :ios,
    pattern: /(<pod name="IdensicMobileSDK" spec="=)([\d.]+)(")/,
    replacement: ->(match, ver) {
      "#{Regexp.last_match(1)}#{ver}#{Regexp.last_match(3)}"
    }
  },
  {
    file: "demo/platforms/ios/SumSubCordova/config.xml",
    platform: :all,
    pattern: /(widget.*?version=")([\d.]+)(")/,
    replacement: ->(match, ver) {
      "#{Regexp.last_match(1)}#{ver}#{Regexp.last_match(3)}"
    }
  },
  {
    file: "demo/platforms/android/app/src/main/res/xml/config.xml",
    platform: :all,
    pattern: /(widget.*?version=")([\d.]+)(")/,
    replacement: ->(match, ver) {
      "#{Regexp.last_match(1)}#{ver}#{Regexp.last_match(3)}"
    }
  },
  

  {
    file: "demo/config.xml",
    platform: :all,
    pattern: /(widget.*?android-versionCode=")([\d.]+)(")/,
    replacement: ->(match, ver) {
      "#{Regexp.last_match(1)}#{android_version_code}#{Regexp.last_match(3)}"
    }
  },
  {
    file: "demo/platforms/android/app/src/main/AndroidManifest.xml",
    platform: :all,
    pattern: /(manifest.*?android:versionCode=")([\d.]+)(")/,
    replacement: ->(match, ver) {
      "#{Regexp.last_match(1)}#{android_version_code}#{Regexp.last_match(3)}"
    }
  },
  {
    file: "demo/platforms/android/app/src/main/res/xml/config.xml",
    platform: :all,
    pattern: /(widget.*?android-versionCode=")([\d.]+)(")/,
    replacement: ->(match, ver) {
      "#{Regexp.last_match(1)}#{android_version_code}#{Regexp.last_match(3)}"
    }
  },
  {
    file: "demo/platforms/ios/SumSubCordova/config.xml",
    platform: :all,
    pattern: /(widget.*?android-versionCode=")([\d.]+)(")/,
    replacement: ->(match, ver) {
      "#{Regexp.last_match(1)}#{android_version_code}#{Regexp.last_match(3)}"
    }
  }
]

PATTERNS.each do |entry|
  file_path = entry[:file]
  platform  = entry[:platform]

  unless File.exist?(file_path)
    warn "Warning: File #{file_path} not found; skipping."
    next
  end

  version_used =
    case platform
    when :ios     then ios_version
    when :android then android_version
    else new_version
    end

  file_data = File.read(file_path)
  updated_data = file_data.gsub(entry[:pattern]) do |match|
    entry[:replacement].call(match, version_used)
  end

  if updated_data != file_data
    File.write(file_path, updated_data)
    puts "Updated #{file_path}"
  end
end

unless system("/usr/libexec/PlistBuddy -c \"Set :CFBundleVersion #{new_version}\" 'demo/platforms/ios/SumSubCordova/SumSubCordova-Info.plist'")
  abort("Error: Failed to update plist.".red)
end

unless system("/usr/libexec/PlistBuddy -c \"Set :CFBundleShortVersionString #{new_version}\" 'demo/platforms/ios/SumSubCordova/SumSubCordova-Info.plist'")
  abort("Error: Failed to update plist.".red)
end

system("npm install")

Dir.chdir("demo") do
  system("bundle install")
  system("npm install")
  
  system("cd platforms/ios && bundle exec pod update IdensicMobileSDK")
end

changed_files = PATTERNS.map { |entry| entry[:file] }.uniq
changed_files << "demo/platform/ios/Podfile.lock"

system("git add #{changed_files.join(' ')}")
system("git commit -m 'Bump version to #{new_version}'")

puts "Done updating version to #{new_version}"