# encoding: utf-8
=begin

* Name: SiSU

** Description: documents, structuring, processing, publishing, search
*** system environment, resource control and configuration details

** Author: Ralph Amissah
  <ralph@amissah.com>
  <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 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

** Hompages:
  <http://www.jus.uio.no/sisu>
  <http://www.sisudoc.org>

** Git
  <http://git.sisudoc.org/gitweb/?p=code/sisu.git;a=summary>
  <http://git.sisudoc.org/gitweb/?p=code/sisu.git;a=blob;f=lib/sisu/git.rb;hb=HEAD>

=end
module SiSU_Git
  require_relative 'dp'                                 # dp.rb
  require_relative 'se'                                 # se.rb
  require_relative 'ao'                                 # ao.rb
  class Source
    def initialize(opt,process=:complete)
      @opt,@process=opt,process
      @env=SiSU_Env::InfoEnv.new
      @md=SiSU_Param::Parameters.new(@opt).get
      @file=SiSU_Env::FileOp.new(@md)
      l=SiSU_Env::StandardiseLanguage.new(@md.opt.lng).language
      unless @opt.lng==l[:c] # @md.i18n[0]==l[:c]
        p "using: #{@opt.lng} (@make: :language:); filename #{@md.fns} filename language: #{l[:c]}, mismatch"
      end
      if @env.output_dir_structure.multilingual?
        m=/((.+?)(?:\~\w{2,3})?)\.((?:-|ssm\.)?sst|ssm)$/ #watch added match for sss
        fnb,fnt=@opt.fns[m,2],@opt.fns[m,3]
      else m=/(.+?)\.((?:-|ssm\.)?sst|ssm)$/
        fnb=@fnn=@opt.fns[m,1]
        fnt=@opt.fns[m,2]
      end
      git_path_fnb=@env.processing_path.git + '/' + fnb
      lng=(@md.opt.lng) ? (@md.opt.lng) : (@md.i18n[0])
      @git_path={
        fnb:       git_path_fnb,
        doc:       git_path_fnb + '/' + Gt[:sisupod] + '/' + Gt[:doc] + '/' + lng,
        po:        git_path_fnb + '/' + Gt[:po] + '/' + lng,
        pot:       git_path_fnb + '/' + Gt[:pot],
        conf:      git_path_fnb + '/' + Gt[:sisupod] + '/' + Gt[:conf],
        image:     git_path_fnb + '/' + Gt[:sisupod] + '/' + Gt[:image],
        audio:     git_path_fnb + '/' + Gt[:sisupod] + '/' + Gt[:audio],
        video:     git_path_fnb + '/' + Gt[:sisupod] + '/' + Gt[:video],
        conf:      git_path_fnb + '/' + Gt[:sisupod] + '/' + Gt[:conf]
      }
      SiSU_AO::Source.new(@opt,nil,@process).read                            # -m
    end
    def create_file_structure_git
      make_dir_fnb
      if program_found?
        git_init
      end
    end
    def read
      create_file_structure_git
      populate.sisusrc_files
      #if program_found?
      #  git_commit
      #end
      unless @opt.act[:quiet][:set]==:on
        (@opt.act[:verbose][:set]==:on \
        || @opt.act[:verbose_plus][:set]==:on \
        || @opt.act[:maintenance][:set]==:on) \
        ? SiSU_Screen::Ansi.new(
            @opt.act[:color_state][:set],
            'Git path',
            @git_path[:fnb]
          ).green_hi_blue
        : SiSU_Screen::Ansi.new(
            @opt.act[:color_state][:set],
            'Git path',
            @git_path[:fnb]
          ).green_title_hi
        if (@opt.act[:verbose][:set]==:on \
        || @opt.act[:verbose_plus][:set]==:on \
        || @opt.act[:maintenance][:set]==:on)
          SiSU_Screen::Ansi.new(
            @opt.act[:color_state][:set],
            "Git path",
            "#{@opt.fns} -> #{@git_path[:fnb]}"
          ).warn
        end
      end
    end
    def program_found?
      found=`whereis git`
      (found =~/bin\/git\b/) ? true : false
    end
    def make_dir_fnb
      FileUtils::mkdir_p(@git_path[:fnb]) \
        unless FileTest.directory?(@git_path[:fnb])
      FileUtils::mkdir_p(@git_path[:doc]) \
        unless FileTest.directory?(@git_path[:doc])
      FileUtils::mkdir_p(@git_path[:po]) \
        unless FileTest.directory?(@git_path[:po])
      FileUtils::mkdir_p(@git_path[:pot]) \
        unless FileTest.directory?(@git_path[:pot])
      FileUtils::mkdir_p(@git_path[:conf]) \
        unless FileTest.directory?(@git_path[:conf])
      FileUtils::mkdir_p(@git_path[:image]) \
        unless FileTest.directory?(@git_path[:image])
      #FileUtils::mkdir_p(@git_path[:audio]) \
      #  unless FileTest.directory?(@git_path[:audio])
      #FileUtils::mkdir_p(@git_path[:video]) \
      #  unless FileTest.directory?(@git_path[:video])
    end
    def git_init
      unless FileTest.directory?("#{@git_path[:fnb]}/.git")
        pwd=Dir.pwd
        Dir.chdir(@git_path[:fnb])
        system("git init ")
        Dir.chdir(pwd)
      end
    end
    def git_commit
      if program_found?
        if FileTest.directory?("#{@git_path[:fnb]}")
          pwd=Dir.pwd
          Dir.chdir(@git_path[:fnb])
          system("
            git add . \
            && git commit -a
          ")
          Dir.chdir(pwd)
        end
      end
    end
    def populate
      def identify_language_versions
        print __FILE__ + ':'
        p __LINE__
      end
      def copy_src_head
        if @opt.f_pth[:lng] \
        and File.exist?("#{@env.path.pwd}/#{@opt.f_pth[:lng]}/#{@opt.fns}")
          FileUtils::cp_r(
            "#{@env.path.pwd}/#{@opt.f_pth[:lng]}/#{@opt.fns}",
            @git_path[:doc]
          )
        elsif @opt.fns =~/\.ssm\.sst/
          ssm=@opt.fns.gsub(/\.ssm\.sst/,'.ssm')
          FileUtils::cp_r(
            "#{@env.path.pwd}/#{ssm}",
            @git_path[:doc]
          )
        elsif File.exist?("#{@env.path.pwd}/#{@opt.fns}")
          FileUtils::cp_r(
            "#{@env.path.pwd}/#{@opt.fns}",
            @git_path[:doc]
          )
        end
      end
      def copy_related_sst_ssi
        doc_import=[]
        @rgx_doc_import=/^<<\s(\S+?\.ss[ti])/
        file_array=IO.readlines(@opt.fns,'')
        file_array.each do |f|
          if f =~@rgx_doc_import
            doc_import = doc_import \
            + f.scan(@rgx_doc_import).uniq.flatten
          end
        end
        doc_import.each do |f|
          if @opt.f_pth[:lng]
            FileUtils::cp_r(
              "#{@env.path.pwd}/#{@opt.f_pth[:lng]}/#{f}",
              @git_path[:doc]
            )
          else
            FileUtils::cp_r(
              "#{@env.path.pwd}/#{f}",
              @git_path[:doc]
            )
          end
        end
      end
      def locate_parse_file
        composite_src=@opt.fns=~/\.ssm$/ ? true : false
        if composite_src \
        and not @opt.act[:ao][:set]==:on
          ##SiSU_Assemble::Composite.new(@opt).read
          #SiSU_AO::Source.new(@opt).read                                         # -m
          @env.processing_path.composite_file \
          + '/' \
          + @opt.fnb \
          + '.ssm.sst'
        elsif composite_src
          @env.processing_path.composite_file \
          + '/' \
          + @opt.fnb \
          + '.ssm.sst'
        else
          @env.path.pwd
          + '/' \
          + @opt.fns
        end
      end
      def read_composite
        #print __FILE__ + ':'
        #p __LINE__
      end
      def sisuyaml_rc
        sisurc=@env.path.sisurc_path
        if FileTest.file?(sisurc)
          FileUtils::cp_r(sisurc,@git_path[:conf])
        end
      end
      def read_src
        print __FILE__ + ':'
        p __LINE__
      end
      def composite_src?
        @opt.fns=~/\.ssm$/ ? true : false
      end
      def sisusrc_files
        populate.copy_src_head
        if composite_src?
          populate.copy_related_sst_ssi
        end
        #parse_file_name=locate_parse_file
        #parse_file=IO.readlines(parse_file_name,'')
        populate.sisuyaml_rc #(parse_file)
        #populate.extract_composite_source
        #populate.read_composite # or read_each_composite
        populate.identify_language_versions
      end
      self
    end
  end
end
__END__
@file.output_path.sisugit
