require "dnnbundler/zipFileGenerator"
require "dnnbundler/packageVersionReplacer"
require "dnnbundler/jsonConfig"
require "thor"
require "json"

module Dnnbundler
    class CLI < Thor
        desc "build CONFIG [options]", "creates a zip package according to given configuration file"
        option :bumpBuild
        option :bumpSprint
        option :targetVersion, :type => :string
        def build( config )
            puts "Build with config #{config}"
            file = File.read(config)
            data_hash = JSON.parse(file)

            manifest_files = data_hash[JsonConfig::Manifests]
            current_version = Dnnbundler::getVersionFromManifest manifest_files[0]
            version_numbers = Dnnbundler::splitVersionNumbers current_version

            version_numbers[1] = version_numbers[1] + 1 if options[:bumpSprint]
            version_numbers[2] = 1 if options[:bumpSprint]
            version_numbers[2] = version_numbers[2] + 1 if options[:bumpBuild]
            version_numbers = Dnnbundler::splitVersionNumbers(options[:targetVersion]) if options[:targetVersion]

            new_version = Dnnbundler::formatVersion(version_numbers)
            puts "current version is #{current_version}"
            puts "new version is #{new_version}"

            data_hash[JsonConfig::Packages].each do |package|
                package[JsonConfig::Name].sub! JsonConfig::PackageVersionPlaceholder, new_version
                Dnnbundler::replaceVersionInManifestFiles manifest_files, new_version

                generator = ZipFileGenerator.new(package)
                generator.write
            end
        end
    end

    def self.formatVersion(version)
        "#{version[0].to_s.rjust(4, "0")}.#{version[1].to_s.rjust(2, "0")}.#{version[2].to_s.rjust(4, "0")}"
    end

    def self.splitVersionNumbers(version_string)
        version_string.split(".").map { |x| x.to_i }
    end
end