module Project_details
  require_relative 'sisu_version'
  include SiSUversion
  def self.name
    'SiSU'
  end
  def self.thor
    "ruby-thor files for the installation/setup of #{name}"
  end
  def self.platform_notice
    "[#{name} is for Linux/Unix Platforms]"
  end
  def self.env
    RbConfig::CONFIG
  end
  def self.host
    env['host']
  end
  def self.dir
    def self.proj
      Project_details.name.downcase
    end
    def self.arch
      env['archdir']
    end
    def self.sitearch
      env['sitearchdir']
    end
    def self.bin
      env['bindir']
    end
    def self.lib
      env['sitelibdir']
    end
    def self.data
      env['datadir']
    end
    def self.share
      "#{env['datadir']}/sisu"
    end
    def self.conf
      env['sysconfdir']
    end
    def self.man
      env['mandir']
    end
    def self.vim
      "#{env['datadir']}/sisu/vim"
    end
    def self.out
      "#{env['localstatedir']}/#{proj}"
    end
    def self.rubylib
      env['LIBRUBYARG_SHARED']
    end
    def self.pwd
      Dir.pwd #ENV['PWD']
    end
    self
  end
  def self.version
    stamp={}
    v="#{dir.pwd}/conf/sisu/version.yml"
    if File.exist?(v)
      stamp=YAML::load(File::open(v))
      stamp[:version]
    else ''
    end
  end
  def self.system_info
    ##{Project_details.platform_notice}
    puts <<-WOK
  Host
    host:             #{Project_details.host}
    arch:             #{Project_details.dir.arch}
    sitearch:         #{Project_details.dir.sitearch}
  Directories for installation
    bin:                                          #{Project_details.dir.bin}
    lib (site-ruby):                              #{Project_details.dir.lib}/#{Project_details.dir.proj}/v*
    conf [etc]:                                   #{Project_details.dir.conf}/#{Project_details.dir.proj}
    data (odf, shared images):                    #{Project_details.dir.share}
    vim  (vim syntax, highlighting, ftplugin):    #{Project_details.dir.data}/sisu/vim
    data (README, version_manifest):              #{Project_details.dir.data}/doc/#{Project_details.dir.proj}
    man (manual pages):                           #{Project_details.dir.man}
    output:                                       #{Project_details.dir.out}
      processing:                                 #{Project_details.dir.out}/processing
      www:                                        #{Project_details.dir.out}/www
    rubylib:                                      #{Project_details.dir.rubylib}

    WOK
  end
end
module Utils
  def self.answer?(ask)
    resp='redo'
    print ask + " ['yes', 'no' or 'quit']: "
    resp=File.new('/dev/tty').gets.strip #resp=gets.strip
    if    resp == 'yes'        then true
    elsif resp == 'no'         then false
    elsif resp =~/^quit|exit$/ then exit
    else                       puts "[please type: 'yes', 'no' or 'quit']"
                               answer?(ask)
    end
  end
  def self.default_notice # local help not implemented description incorrect
    ans= %{#{Project_details.thor}
    Information on alternative actions is available using:
    [if ruby-thor is installed:]
      "#{$called_as} help")
    Default action selected - "install #{Project_details.name}" proceed? }
    resp=answer?(ans)
    exit unless resp
  end
  def self.chmod_file(place)
    if place =~/\/bin/; File.chmod(0755,place)
    else                File.chmod(0644,place)
    end
  end
  def self.chmod_util(place)
    if place =~/\/bin/; chmod(0755,place)
    else                chmod(0644,place)
    end
  end
  def self.system_date
    `date "+%Y-%m-%d"`.strip
  end
  def self.system_date_stamp
    `date "+%Yw%W/%u"`.strip
  end
  def self.program_found?(prog)
    found=`which #{prog}` #`whereis #{make}`
    (found =~/bin\/#{prog}\b/) ? :true : :false
  end
end
module Version_info
  def self.contents(vi)
    <<-WOK
---
:project: #{vi[:project]}
:version: #{vi[:version]}
:date_stamp: #{vi[:date_stamp]}
:date: "#{vi[:date]}"
    WOK
  end
  module Current
    def self.yml_file_path(version)
      "data/sisu/#{version}/v/version.yml"
    end
    def self.settings(file)
      v="#{Dir.pwd}/#{file}"
      if File.exist?(v)
        YAML::load(File::open(v))
      else ''
      end
    end
    def self.file_stable
      yml_file_path(SiSU_version_dir_stable)
    end
    def self.file_unstable
      yml_file_path(SiSU_version_dir_unstable)
    end
    def self.setting_stable
      settings(file_stable)
    end
    def self.setting_unstable
      settings(file_unstable)
    end
    def self.content_stable
      Version_info.contents(setting_stable)
    end
    def self.content_unstable
      Version_info.contents(setting_unstable)
    end
  end
  module Next
    def self.settings(v)
      {
        project:        "#{Project_details.name}",
        version:        "#{v}",
        date:           "#{Utils.system_date}",
        date_stamp:     "#{Utils.system_date_stamp}",
      }
    end
    def self.setting_stable
      settings(SiSU_version_next_stable)
    end
    def self.setting_unstable
      settings(SiSU_version_next_unstable)
    end
    def self.content_stable
      Version_info.contents(setting_stable)
    end
    def self.content_unstable
      Version_info.contents(setting_unstable)
    end
  end
  module Update
    def self.version_info_update_commit(filename,vi_hash_current,vi_content_current,vi_hash_next,vi_content_next)
      ans=%{update #{Project_details.name.downcase} version info replacing:
  #{vi_hash_current.sort}
with:
  #{vi_hash_next.sort}

#{vi_content_current} becoming:
#{vi_content_next}
proceed? }
      resp=Utils.answer?(ans)
      if resp
        fn="#{Dir.pwd}/#{filename}"
        if File.writable?("#{Dir.pwd}/.")
          file_version=File.new(fn,'w+')
          file_version << vi_content_next
          file_version.close
        else
          puts %{*WARN* is the file or directory writable? could not create #{filename}}
        end
      end
    end
    def self.update_stable
      version_info_update_commit(
        Version_info::Current.file_stable,
        Version_info::Current.setting_stable,
        Version_info::Current.content_stable,
        Version_info::Next.setting_stable,
        Version_info::Next.content_stable
      )
    end
    def self.update_unstable
      version_info_update_commit(
        Version_info::Current.file_unstable,
        Version_info::Current.setting_unstable,
        Version_info::Current.content_unstable,
        Version_info::Next.setting_unstable,
        Version_info::Next.content_unstable
      )
    end
    def self.changelog_header(vi)
      <<-WOK
%% #{vi[:version]}.orig.tar.xz (#{vi[:date]}:#{vi[:date_stamp].gsub(/20\d\dw/,'')})
http://git.sisudoc.org/gitweb/?p=code/sisu.git;a=log;h=refs/tags/sisu_#{vi[:version]}
http://git.sisudoc.org/gitweb/?p=code/sisu.git;a=log;h=refs/tags/debian/sisu_#{vi[:version]}-1
http://www.jus.uio.no/sisu/pkg/src/sisu_#{vi[:version]}.orig.tar.xz
  sisu_#{vi[:version]}.orig.tar.xz
  sisu_#{vi[:version]}-1.dsc
      WOK
    end
    def self.changelog_header_stable
      changelog_header(Version_info::Current.setting_stable)
    end
    def self.changelog_header_unstable
      changelog_header(Version_info::Current.setting_unstable)
    end
  end
  self
end
module Package
  def self.sequence
    puts <<-WOK
  --update-version  # update package version
  --tag             # git tags upstream version
  --merge           # git merge upstream tag into debian/sid
  --dch             # dch create and edit
  --dch-commit      # dch commit
  --build           # git-buildpackage
  --git_push        # git push changes
  --dput            # dput package
  --reprepro_update # reprepro update
  --reprepro_push   # reprepro rsync changes
    WOK
  end
  def self.tag_upstream_and_merge_into_debian_sid
    system(%{
      git tag -a sisu_#{SiSU_VERSION} -m"SiSU #{SiSU_VERSION}" &&
      git checkout debian/sid &&
      git merge sisu_#{SiSU_VERSION}
    })

  end
  def self.tag_upstream
    system(%{
      git tag -a sisu_#{SiSU_VERSION} -m"SiSU #{SiSU_VERSION}"
    })
  end
  def self.merge_into_debian_sid
    system(%{
      git checkout debian/sid &&
      git merge sisu_#{SiSU_VERSION}
    })
  end
  def self.debian_changelog_create
    if File.directory?('./debian')
      system(%{
        git-dch -R -N #{SiSU_VERSION}-1 --full
      })
    else puts 'not in git branch: debian/sid ?'
    end
  end
  def self.debian_changelog_commit
    system(%{
      git commit -a -m"debian/changelog (#{SiSU_VERSION}-1)"
    })
  end
  def self.debian_package_build
    system(%{
      git-buildpackage --git-upstream-tag=sisu_%(version)s --git-debian-tag=debian/sisu_%(version)s --git-tag --git-keyid=#{Dev::GPGpubKey}
    })
  end
  def self.debian_package_dput
    #system(%{
    #  dput -s sisu_#{SiSU_VERSION}-1_amd64.changes
    #})
    system(%{
      dput sisu_#{SiSU_VERSION}-1_amd64.changes
    })
  end
  def self.debian_package_push
    system(%{
      git push --all &&
      git push --tags
    })
  end
  def self.reqprepro_update
    dir_repo=Pathname.new(
      "#{Dir.home}/grotto/repo/deb.repo/debian/rep"
    )
    dir_build=Pathname.new(
      "#{Dir.home}/grotto/repo/git.repo/code/builds/sisu_#{SiSU_VERSION}-1_amd64.changes"
    )
    system(%{
      cd #{dir_repo.dirname} &&
      reprepro -Vb . include unstable #{dir_build}
      cd -
    })
  end
  def self.reprepro_push
    dir_repo=Pathname.new(
      "#{Dir.home}/grotto/repo/deb.repo/debian/rep"
    )
    system(%{
      cd #{dir_repo} &&
      rsync -av --delete-after {dists,pool} sisudoc:/srv/www/sisu/archive/. &&
      rsync -av --delete-after {dists,pool} ralpha@uio:./sisu/archive/.
    })
  end
end
