#encoding: utf-8
#- Name: SiSU
#
#  - Description: documents, structuring, processing, publishing, search
#    config
#
#  - 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,
#
#  - 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>
module SiSU_Initialize
  require_relative 'se'                                 # se.rb
    include SiSU_Env
    include SiSU_Screen
  require_relative 'relaxng'                            # relaxng.rb
    include SiSU_Relaxng
  require_relative 'css'                                # css.rb
    include SiSU_Style
  class Source
    def initialize(opt)
      @opt=opt
    end
    def read
      ConfigSite.new(@opt).make_homepage
      ConfigSite.new(@opt).css
      ConfigSite.new(@opt).dtd
      ConfigSite.new(@opt).cp_local_images
      ConfigSite.new(@opt).cp_external_images
      ConfigSite.new(@opt).cp_webserver_images
    end
  end
  class ConfigSite #config files such as css are not updated if they already exist unless forced using the --init=site modifier
    require_relative 'se'                               # se.rb
    def initialize(opt)
      @opt=opt
      @env=SiSU_Env::InfoEnv.new(@opt.fns)
      @suffix={
        rnc: 'rnc',
        rng: 'rng',
        xsd: 'xsd',
      }
      @path={
        xml: @env.path.output + '/_sisu/xml',
        xsd: @env.path.output + '/_sisu/xml/xsd',
        rnc: @env.path.output + '/_sisu/xml/rnc',
        rng: @env.path.output + '/_sisu/xml/rng',
        style: @env.path.output + '/' + @env.path.style,
      }
      @pwd,@home=Dir.pwd,@env.path.home
    end
    def make_homepage
      SiSU_Screen::Ansi.new(
        @opt.act[:color_state][:set],
        'invert',
        'Make homepage',
        ''
      ).colorize unless @opt.act[:quiet][:set]==:on
      SiSU_Env::CreateSite.new(@opt).homepage
    end
    def cp_local_images
      SiSU_Screen::Ansi.new(
        @opt.act[:color_state][:set],
        'invert',
        'Copy images',
        ''
      ).colorize unless @opt.act[:quiet][:set]==:on
      SiSU_Env::CreateSite.new(@opt).cp_local_images
      SiSU_Env::CreateSite.new(@opt).cp_webserver_images_local #this should not have been necessary
      SiSU_Env::CreateSite.new(@opt).cp_base_images #base images (nav etc.) used by all html
    end
    def cp_external_images
      SiSU_Screen::Ansi.new(
        @opt.act[:color_state][:set],
        'invert',
        'Copy external images',
        ''
      ).colorize if @opt.act[:verbose_plus][:set]==:on
      SiSU_Env::CreateSite.new(@opt).cp_external_images
    end
    def cp_webserver_images
      SiSU_Screen::Ansi.new(
        @opt.act[:color_state][:set],
        'invert',
        'Copy webserver/output file images',
        ''
      ).colorize unless @opt.act[:quiet][:set]==:on
      SiSU_Env::CreateSite.new(@opt).cp_webserver_images
    end
    def css
      SiSU_Screen::Ansi.new(
        @opt.act[:color_state][:set],
        'invert',
        'Configuring CSSs',
        ''
      ).colorize unless @opt.act[:quiet][:set]==:on
      SiSU_Env::CreateSite.new(@opt).cp_css
    end
    def dtd
      SiSU_Screen::Ansi.new(
        @opt.act[:color_state][:set],
        'invert',
        'Configuring DTDs',
        ''
      ).colorize unless @opt.act[:quiet][:set]==:on
      @rxng=SiSU_Relaxng::RelaxNG.new
      @path.each { |d| FileUtils::mkdir_p(d[1]) \
      unless FileTest.directory?(d[1]) }
      #ugly code, sort later
      if @rxng.methods.join =~/[^_]dtd_sax\b/
        if @rxng.dtd_sax.length > 200
          dtd=File.new("#{@path[:style]}/#{@rxng.rng_name.output_sax}",'w')
          dtd << @rxng.dtd_sax
          dtd.close
        else trang_rnc_model_output_sax
        end
      else trang_rnc_model_output_sax
      end
      if @rxng.methods.join =~/[^_]dtd_dom\b/
        if @rxng.dtd_dom.length > 200
          dtd=File.new("#{@path[:style]}/#{@rxng.rng_name.output_dom}",'w')
          dtd << @rxng.dtd_dom
          dtd.close
        else trang_rnc_model_output_dom
        end
      else trang_rnc_model_output_dom
      end
      if @rxng.methods.join =~/[^_]dtd_node\b/
        if @rxng.dtd_node.length > 200
          dtd=File.new("#{@path[:style]}/#{@rxng.rng_name.input_node}",'w')
          dtd << @rxng.dtd_node
          dtd.close
        else trang_rnc_model_input_node
        end
      else trang_rnc_model_input_node
      end
      if @rxng.methods.join =~/[^_]dtd_xhtml\b/
        if @rxng.dtd_xhtml.length > 200
          dtd=File.new("#{@path[:style]}/#{@rxng.rng_name.output_xhtml}",'w')
          dtd << @rxng.dtd_xhtml
          dtd.close
        else trang_rnc_model_output_xhtml
        end
      else trang_rnc_model_output_xhtml
      end
    end
    def trang_rnc_model_output_sax
      s=@suffix
      rnc_src=@env.processing_path.ao + '/sax.' + s[:rnc]
      rnc_file=@path[:rnc] + '/' + @rxng.rnc_name.output_sax
      rng_file=@path[:rng] + '/' + @rxng.rng_name.output_sax
      xsd_file=@path[:xsd] + '/' + @rxng.xsd_name.output_sax
      rnc=File.new(rnc_src,'w')
      rnc << @rxng.rnc_model_output_sax
      rnc.close
      #xsd
      schema=SiSU_Env::SystemCall.new(rnc_src,xsd_file)
      schema.relaxng(@opt.selections.str)
      #rng
      schema=SiSU_Env::SystemCall.new(rnc_src,rng_file)
      schema.relaxng(@opt.selections.str)
      #rnc
      if FileTest.file?(rnc_src)
        FileUtils::cp(rnc_src,rnc_file)
        FileUtils::chmod(0644,rnc_file)
      else STDERR.puts %{\t*WARN* did not find rnc - "#{rnc_src}" [#{__FILE__}:#{__LINE__}]}
      end
    end
    def trang_rnc_model_output_dom
      s=@suffix
      rnc_src=@env.processing_path.ao + '/dom.' + s[:rnc]
      rnc_file=@path[:rnc] + '/' + @rxng.rnc_name.output_dom
      rng_file=@path[:rng] + '/' + @rxng.rng_name.output_dom
      xsd_file=@path[:xsd] + '/' + @rxng.xsd_name.output_dom
      rnc=File.new(rnc_src,'w')
      rnc << @rxng.rnc_model_output_dom
      rnc.close
      #xsd
      schema=SiSU_Env::SystemCall.new(rnc_src,xsd_file)
      schema.relaxng(@opt.selections.str)
      #rng
      schema=SiSU_Env::SystemCall.new(rnc_src,rng_file)
      schema.relaxng(@opt.selections.str)
      #rnc
      if FileTest.file?(rnc_src)
        FileUtils::cp(rnc_src,rnc_file)
        FileUtils::chmod(0644,rnc_file)
      else STDERR.puts %{\t*WARN* did not find rnc - "#{rnc_src}" [#{__FILE__}:#{__LINE__}]}
      end
    end
    def trang_rnc_model_output_xhtml
      s=@suffix
      rnc_src=@env.processing_path.ao + '/xhtml.' + s[:rnc]
      rnc_file=@path[:rnc] + '/' + @rxng.rnc_name.output_xhtml
      rng_file=@path[:rng] + '/' + @rxng.rng_name.output_xhtml
      xsd_file=@path[:xsd] + '/' + @rxng.xsd_name.output_xhtml
      rnc=File.new(rnc_src,'w')
      rnc << @rxng.rnc_model_output_xhtml
      rnc.close
      #xsd
      schema=SiSU_Env::SystemCall.new(rnc_src,xsd_file)
      schema.relaxng(@opt.selections.str)
      #rng
      schema=SiSU_Env::SystemCall.new(rnc_src,rng_file)
      schema.relaxng(@opt.selections.str)
      #rnc
      if FileTest.file?(rnc_src)
        FileUtils::cp(rnc_src,rnc_file)
        FileUtils::chmod(0644,rnc_file)
      else STDERR.puts %{\t*WARN* did not find rnc - "#{rnc_src}" [#{__FILE__}:#{__LINE__}]}
      end
    end
    def trang_rnc_model_input_sax
      rnc_file=@env.processing_path.ao + '/sax.rnc'
      dtd_file=@path[:xsd] + '/' + @rxng.rng_name.input_sax
      rnc=File.new(rnc_file,'w')
      rnc << @rxng.rnc_model_output_sax
      rnc.close
      schema=SiSU_Env::SystemCall.new(rnc_file,dtd_file)
      schema.relaxng(@opt.selections.str)
    end
    def trang_rnc_model_input_dom
      rnc_file=@env.processing_path.ao + '/dom.rnc'
      dtd_file=@path[:xsd] + '/' + @rxng.rng_name.input_dom
      rnc=File.new(rnc_file,'w')
      rnc << @rxng.rnc_model_output_dom
      rnc.close
      schema=SiSU_Env::SystemCall.new(rnc_file,dtd_file)
      schema.relaxng(@opt.selections.str)
    end
    def trang_rnc_model_input_node
      rnc_file=@env.processing_path.ao + '/node.rnc'
      dtd_file=@path[:xsd] + '/' + @rxng.rng_name.input_node
      rnc=File.new(rnc_file,'w')
      rnc << @rxng.rnc_model_input_node
      rnc.close
      schema=SiSU_Env::SystemCall.new(rnc_file,dtd_file)
      schema.relaxng(@opt.selections.str)
    end
  end
end
__END__
