require 'thor'
require 'fwtoolkit/cli/xcode'
require 'fwtoolkit/cli/cocoapods'
require 'fwtoolkit/cli/git'
require 'fwtoolkit/cli/bitrise'
require 'fwtoolkit/projectfile'
require 'fwtoolkit/git_client'
require 'fwtoolkit/cli/thorutils'

module FWToolkit
  class Project < Thor
    include Thor::Actions

    include FWToolkit::ThorUtils
    source_root_templates!

    desc "proj create [PROJECT NAME]", "Create a new Xcode project with FW's settings. Language is either objc or swift"
    def create(project_name)
        invoke :new, ["swift", project_name, ""]
    end

    desc "proj new [swift|objc] [PROJECT NAME] [CLASS PREFIX]", "Create a new Xcode project with FW's settings. Language is either objc or swift"
    def new(project_language, project_name, class_prefix="")

      unless project_language == "swift" or project_language == "objc" 
        say_status :error, "Project language should be either swift or objc", :red
        return
      end

      if project_language == "objc" and class_prefix == ""
        say_status :error, "Objc projects require a class prefix", :red
        return
      end

      clean_project_name = project_name.gsub("-", "_")

      destination_root = File.join(Dir.pwd, clean_project_name)

      say "Creating new project in: #{File.expand_path destination_root}"

      invoke :conf_gemset, [destination_root]

      invoke FWToolkit::Bitrise, 'ios', [destination_root, clean_project_name]

      invoke FWToolkit::Xcode, 'new', [project_language, clean_project_name, class_prefix.upcase, File.join(Dir.pwd, clean_project_name)]
      invoke FWToolkit::Cocoapods, 'install', [destination_root]

      git_repo = GitClient::Repository.new destination_root
      
      if(git_repo.initialized?)
        say_status :skip, 'The git repository is already initialized', :yellow
      else
        invoke FWToolkit::Git, 'new', [destination_root]
      end
    end

    desc "proj conf_gemset [PROJECT_DIR]", "Configure gem environment on a project's folder"
    def conf_gemset(project_root=Dir.pwd)
      @project_name = File.basename(project_root)
      destination_root = project_root

      say 'Configuring Gemset'

      directory "templates/default_project/gemset", destination_root

      inside(destination_root) do
        bundle_update
      end
    end

    desc "proj update [PROJECT_DIR]", "Update project's pods/gems and submodules"
    def update(project_root=Dir.pwd)
      bundle_update
      
      invoke FWToolkit::Git, 'update', [project_root]
      invoke FWToolkit::Cocoapods, 'install', [project_root]
      
    end

    private

    def bundle_update
      if File.exists? 'Gemfile'
        say 'Installing bundle'
        begin
          retried ||= false
          run! "gem install bundler", :capture => true
          run! "bundle install", :capture => true
        rescue Thor::Error
          retried = true
          retry unless retried
        end
      else
        say 'No gemfile found'
      end

    end

  end
end