# Copyright © 2017 Applause Inc. All rights reserved.

require 'fileutils' require 'git' require 'cocoapods'

PODSPEC_TEMPLATE_PATH = “./Applause-Podspecs/%{pod_name}/%{pod_name}.template” PODSPEC_PATH = “./Applause-Podspecs/%{pod_name}/%{version}/%{pod_name}.podspec”

namespace :podspec do

desc "Generates podspec for given setup name"
task :generate, [:setup_name] do |t, args|
  setup_name = args[:setup_name]
              setup = BuildConfiguration.load(setup_name)
              version = Plist.version(setup.release_configuration.plist)
  pod_name = setup.release_configuration.pod_name
  template_path = PODSPEC_TEMPLATE_PATH % {pod_name: pod_name, version: version}
  podspec_path = PODSPEC_PATH % {pod_name: pod_name, version: version}
  podspec = generate_podspec(template_path, version)
  save_podspec(podspec_path, podspec)
end

task :verify, [:setup_name] do |t, args|
  pod_name, version = properties_from_setup(args[:setup_name])
  podspec_path = PODSPEC_PATH % {pod_name: pod_name, version: version}
  if !lint_podspec(podspec_path)
    raise "*** Podspec is not valid! ***"
  end
end

desc "Generates and commits podspec for given setup name"
task :commit, [:setup_name] => :generate do |t, args|
  setup_name = args[:setup_name]
              setup = BuildConfiguration.load(setup_name)
              version = Plist.version(setup.release_configuration.plist)
  pod_name = setup.release_configuration.pod_name
  podspec_path = PODSPEC_PATH % {pod_name: pod_name, version: version}
  commit_message = "Generated #{pod_name} Podspec for #{version}"
  commit(podspec_path, commit_message)
end

def generate_podspec(template_path, version)
  template_file = File.open(template_path)
  template = template_file.read
  podspec = template % {version: version}
  puts "New podspec:"
  puts podspec
  return podspec
end

def save_podspec(podspec_path, podspec_contents)
  dirname = File.dirname(podspec_path)
  unless File.directory?(dirname)
    FileUtils.mkdir_p(dirname)
  end
  File.open(podspec_path, 'w') {|f|
    f.write(podspec_contents)
  }
end

def lint_podspec(podspec_path)
  validator = Pod::Validator.new(podspec_path, [])
  valid = validator.validate
  if !valid
    validator.print_results
  else
    puts "*** Podspec is valid! ***"
  end
  return valid
end

def commit(file, message)
  sdk_repo = Git.open('.')
  sdk_repo.add(file)
  sdk_repo.commit(message)
end

def properties_from_setup(setup_name)
              setup = BuildConfiguration.load(setup_name)
              version = Plist.version(setup.release_configuration.plist)
  pod_name = setup.release_configuration.pod_name
  return [pod_name, version]
end

end