require 'versionomy'
require 'timewizard/utils/wizardry'

module Timewizard
  # Contains the various OS implementations of the RubyGem version spec.
  # @author Richard Harrah
  # @since 0.1.0
  module Versioner
    # Represents the most basic of versioners. Raises errors if attempted to be used.
    # @abstract
    # @author Richard Harrah
    # @since 0.2.4
    class Base

      public

      # file to parse
      # @return [String] file that is going to be parsed
      attr_reader :file

      # build number held by parsed file
      # @return [String] build number currently contained in the parsed file
      attr_reader :old_build_number

      # version number held by parsed file
      # @return [String] version number currently contained in the parsed file
      attr_reader :old_version_number

      # bumped build number from parsed file
      # @return [String] bumped build number
      attr_reader :bumped_build_number

      # bumped version number from parsed file
      # @return [String] bumped version number
      attr_reader :bumped_version_number

      # build number to write to parsed file
      # @return [String] build number to write to the parsed file
      attr_accessor :new_build_number

      # version number to write to parsed file
      # @return [String] version number to write to the parsed file
      attr_accessor :new_version_number

      # Creates a new Versioner instance.
      # @param [String] path_to_file path to file that contains version information
      # @return [self] new Versioner instance
      def initialize(path_to_file)
        if path_to_file.nil?
          raise "passed in file cannot be nil"
        end
        @file = path_to_file
        @old_build_number = nil
        @old_version_number = nil
        @bumped_build_number = nil
        @bumped_version_number = nil
        @new_build_number = nil
        @new_version_number = nil
      end

      # Reads the build numbers from {Timewizard::Versioner::Base.file}.
      # @return [self] mutated versioner instance
      def read_build_numbers
        read_file
        find_build_numbers
        self
      end

      # Reads the version numbers from {Timewizard::Versioner::Base.file}.
      # @return [self] mutated versioner instance
      def read_version_numbers
        read_file
        find_version_numbers
        self
      end

      # Writes the build numbers to {Timewizard::Versioner::Base.file}.
      # @return [self] mutated versioner instance
      def write_build_numbers
        change_build_numbers
        write_file
        self
      end

      # Writes the version numbers to {Timewizard::Versioner::Base.file}.
      # @return [self] mutated versioner instance
      def write_version_numbers
        change_version_numbers
        write_file
        self
      end

      private

      def read_file
        raise NotImplementedError
      end

      def write_file
        raise NotImplementedError
      end

      def find_build_numbers
        bn = find_build_and_version_numbers
        @old_build_number = bn[0]
        @new_build_number = bn[2]
        [@old_build_number, @new_build_number]
      end

      def find_version_numbers
        vn = find_build_and_version_numbers
        @old_version_number = vn[1]
        @new_version_number = vn[3]
        [@old_version_number, @new_version_number]
      end

      def find_build_and_version_numbers
        raise NotImplementedError
      end

      def change_build_numbers
        raise NotImplementedError
      end

      def change_version_numbers
        raise NotImplementedError
      end

    end

    autoload :Android, 'timewizard/versioner/android'
    autoload :Apple, 'timewizard/versioner/apple'
    autoload :Worklight, 'timewizard/versioner/worklight'
    autoload :Cordova, 'timewizard/versioner/cordova'
  end
end