#!/usr/bin/env ruby
#encoding: utf-8
#- Name: SiSU
#
#  - Description: documents, structuring, processing, publishing, search
#    sisu
#
#  - Author: Ralph Amissah
#    <ralph.amissah@gmail.com>
#
#  - Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
#    2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2019,
#    2020, 2021, Ralph Amissah,
#    All Rights Reserved.
#
#  - License: GPL 3 or later:
#
#    SiSU, a framework for document structuring, publishing and search
#
#    Copyright (C) Ralph Amissah
#
#    This program is free software: you can redistribute it and/or modify it
#    under the terms of the GNU General Public License as published by the Free
#    Software Foundation, either version 3 of the License, or (at your option)
#    any later version.
#
#    This program is distributed in the hope that it will be useful, but WITHOUT
#    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
#    FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
#    more details.
#
#    You should have received a copy of the GNU General Public License along with
#    this program. If not, see <http://www.gnu.org/licenses/>.
#
#    If you have Internet connection, the latest version of the GPL should be
#    available at these locations:
#    <http://www.fsf.org/licensing/licenses/gpl.html>
#    <http://www.gnu.org/licenses/gpl.html>
#
#    <http://www.sisudoc.org/sisu/en/manifest/gpl.fsf.html>
#
#  - SiSU uses:
#    - Standard SiSU markup syntax,
#    - Standard SiSU meta-markup syntax, and the
#    - Standard SiSU object citation numbering and system
#
#  - Homepages:
#    <http://www.sisudoc.org>
#
#  - Git
#    <https://git.sisudoc.org/projects/>
#    <https://git.sisudoc.org/projects/?p=software/sisu.git;a=summary>
#    <https://git.sisudoc.org/projects/?p=markup/sisu-markup-samples.git;a=summary>
begin
  require 'thor'
rescue LoadError
  puts 'thor (package ruby-thor) not found'
end
require 'find'
require 'fileutils'
  include FileUtils
require 'pathname'
require 'rbconfig.rb'
module SiSUconf
  class LanguageCodes
    def language_list
      def codes
        %w[am bg bn br ca cs cy da de el en eo es et eu fi fr ga gl he hi hr hy ia is it ja ko la lo lt lv ml mr nl nn no oc pl pt pt_BR ro ru sa se sk sl sq sr sv ta te th tk tr uk ur us vi zh]
      end
      def regex
        codes.join('|')
      end
      self
    end
  end
  class DetermineLibsPath
    def version
      def stable
       '5'
      end
      def unstable
       '6'
      end
      self
    end
    def processing
      def called_as
        $0
        #$called_as
      end
      def called_as_exe
        File.basename(called_as)
      end
      def called_as_exe_strip_current_develop
        File.basename(called_as).gsub(/-(?:current|develop)/,'')
      end
      def argv
        $*
        #$argv
      end
      def argv_str
        argv.inspect
      end
      def file_full_path
        __FILE__
      end
      def current
        'current'
      end
      def next
        'develop'
      end
      def stable_bin_file_regex
        %r{\bsisu#{version.stable}$}
      end
      def unstable_bin_file_regex
        %r{\bsisu#{version.unstable}$}
      end
      def stable_modifier_regex
        %r{"(?:--v#{version.stable}|--current|--stable)"}
      end
      def unstable_modifier_regex
        %r{"(?:--v#{version.unstable}|--next|--unstable)"}
      end
      def lib_filename
        'sisu_thor_lib'
      end
      self
    end
    def sisu_run_from?
      if processing.called_as == processing.file_full_path \
      and File.dirname(processing.file_full_path) != RbConfig::CONFIG['bindir']
        :full_path_to_sisu_bin_in_sisu_dir_tree
      elsif processing.file_full_path =~/\/gems\// \
      and processing.file_full_path \
      =~ /\/#{called_as_exe_strip_current_develop}(?:-(?:current|develop))\.(?:\d+|[a-z])\.(?:\d+|[a-z])\//
        :gem_install
      else
        :system_install
      end
    end
    def branch_name_
      if sisu_run_from? == :full_path_to_sisu_bin_in_sisu_dir_tree \
      or sisu_run_from? == :system_install
        case processing.called_as
        when processing.stable_bin_file_regex      then processing.current
        when processing.unstable_bin_file_regex    then processing.next
        else
          case processing.argv_str
          when processing.stable_modifier_regex    then processing.current
          when processing.unstable_modifier_regex  then processing.next
          else                                          processing.current
          end
        end
      elsif sisu_run_from? == :gem_install
        case processing.file_full_path
        when processing.stable_gem_regex           then processing.current
        when processing.unstable_gem_regex         then processing.next
        else                                            processing.current
        end
      else                                              processing.current
      end
    end
    def sisu_path_specified_lib
      if (processing.called_as \
      !~ /^#{RbConfig::CONFIG['bindir']}\/#{called_as_exe_strip_current_develop}(?:-(?:current|develop))?$/)
        File.expand_path(processing.called_as).
          sub(/bin\/#{called_as_exe_strip_current_develop}(?:-(?:current|develop))?$/,'lib')
      else nil
      end
    end
    def sisu_lib
      "sisu/#{branch_name_}"
    end
    def sisu_path_lib
      if sisu_path_specified_lib \
      && FileTest.file?("#{sisu_path_specified_lib}/#{sisu_lib}/#{lib_filename}.rb")
        "#{sisu_path_specified_lib}/#{sisu_lib}"
      else sisu_lib
      end
    end
  end
  class Configure < Thor
    $SiSU_Language_Codes=LanguageCodes.new
    paths= DetermineLibsPath.new
    #p "#{paths.sisu_path_lib}/#{paths.processing.lib_filename}"
    require "#{paths.sisu_path_lib}/#{paths.processing.lib_filename}" # sisu_thor_lib.rb
    @@source=@@targets=nil
    include SiSU_Po4a_Actions
    class_option :verbose, :type => :boolean
# rake help clean default distclean make manpage readme rebuild
    desc 'po4a',
      'place SiSU translations under po4a management' \
      + 'assist with having sisu markup files managed by po4a' \
      + 'create configuration files, and language directories and' \
      + 'populate them with po4a pot & po files for translation and' \
      + 'from those (as translated) create translated sisu markup' \
      + '.ssm .sst & .ssi files in corresponding language sub-directories' \
      + '*WARNING* creates, destroys, overwrites directories not managed by po4a'
    options \
      :help => :boolean,
      :clean => :boolean,
      #:default => :boolean,
      :distclean => :boolean,
      :make => :boolean,
      :lang_source => :string,
      :lang_targets => :array,
      :manpage => :boolean,
      :readme => :boolean,
      :rebuild => :boolean,
      :current => :string,
      :next => :string,
      :stable => :string,
      :unstable => :string
    def po4a
      @@source=source=if options[:lang_source] \
      and not options[:lang_source].empty?
        options[:lang_source]
      else nil
      end
      @@targets=targets=if options[:lang_targets]
        options[:lang_targets]
      else nil
      end
      language.translation_languages_selected(targets)
      language.source_language_selected(source)
      if options[:help]
        notice.project_help
      end
      if options[:clean]
        notice.default(:clean)
        project.clean
      end
      #if options[:default]
      #  notice.project_help
      #end
      if options[:distclean]
        notice.default(:distclean)
        project.distclean
      end
      if options[:make]
        notice.default(:make)
        project.make
      end
      if options[:manpage]
        generate.manpage
      end
      if options[:readme]
        generate.readme
      end
      if options[:rebuild]
        notice.default(:rebuild)
        project.distclean
        project.make
      end
    end
  end
end
begin
  require 'rbconfig'
  $called_as,$argv=$0,$*
  SiSUconf::Configure.start(ARGV)
rescue
end
__END__
#% manual settings, edit/update as required (note current default settings are obtained from sisu version yml file)
__END__