#!/usr/bin/env ruby
=begin

= gtattr.rb : netCDF ファイルの属性を付加/修正する
  
= USAGE :

  $ gtattr.rb -[hH] [--delete=attr] [ncfile] [var] [attr=hoge]
  $ gtattr.rb --cp_global [ncfile1] [ncfile2]

= note

* 今のところ, 変数に対する属性しか指定できず.
  
=end


require "getopts"
require "numru/netcdf"
module NumRu
  class NetCDFVar
    alias put scaled_put
    alias get scaled_get
  end
end

#require "numru/ggraph"
include NumRu


def print_help

print <<HELP

====================================================
                #{File.basename($0)} ver.0.1
====================================================

USAGE:

    $ gtattr.rb -[dhH] [--delete=attr][attr=hoge] [var/global] [ncfile] 

    $ gtattr.rb --cp_global [ncfile1] [ncfile2]

  * データフォーマットは netCDF に限る. 

  * 引数解説

    [ncfile] : 対象とする netCDF ファイル名を指定. 
               (ex. mean-V_2001_01.nc)
               複数指定可能. その場合, 変数値を各格子毎に平均
               したものを出力する.

    [var]    : 足したい変数名.

  * オプション

    -h, -H, --help : このメッセージを表示.
    -d, --delete   : 指定した属性を消去する.
    --cp_global    : グローバル属性をコピー.

HISTORY:

  2003/12/06  created  by daktu32@ep.sci.hokudai.ac.jp

====================================================

HELP
exit
end


# オプション解析 ----------------------------------------------------
unless getopts("dhH", "help", "delete:", "cp_global", "attr:")
  print "#{$0}:illegal options. please exec this program with -h/--help. \n"
  exit 1
end


if ($OPT_h) || ($OPT_H) || ($OPT_help) || ARGV.size == 0 then
print_help
exit 1
end

# 引数中の nc ファイルのみ格納



# メインルーチン



if ($OPT_cp_global) then
  file1 = ARGV[0]; file2 = ARGV[1]

  ncfile1 = NetCDF.new(file1, "r") # ファイルオープン. モードの値に注意. 
  ncfile2 = NetCDF.new(file2, "a+") # ファイルオープン. モードの値に注意. 

  ncfile2.redef

  ncfile1.each_att{|i|
    i.copy(ncfile2)
  }

  ncfile1.close;   ncfile2.close

  exit 
end

if ($OPT_delete)
  var_name = ARGV.shift
p  file = ARGV

  file.each do |f|
    p ncfile = NetCDF.new(f,"a")
    ncfile.redef
    if var_name == "global" then
      p ncfile.att(($OPT_delete)).delete
    elsif var_name == "global_all" then
      p ncfile.each_att{|a| a.delete}
    else
      p ncfile.var(var_name).att(($OPT_delete)).delete 
    end
    ncfile.close
  end
  exit
end


attr = ARGV.shift.split('=') 
p attr_name = attr[0]
p attr_var = attr[1].to_s
p var_name  = ARGV.shift
p file   = ARGV

file.each do |f|
  
  p ncfile = NetCDF.new(f, "a") # ファイルオープン. モードの値に注意. "w" は現在の中身を消去して, 新規データを上書きする!! 

  ncfile.redef

  if attr_name == "name" && var_name == "global" then
    ncfile.att($OPT_attr).name=attr_var
  elsif attr_name == "name" then
    ncfile.var(var_name).name=attr_var
  elsif var_name == "global" then
      ncfile.put_att(attr_name, attr_var)
  else
    p  ncfile.var(var_name).put_att(attr_name, attr_var)
  end
  ncfile.enddef
  ncfile.close

end

