/*
 * write data
 *
 * write(type1, type2, type3, basetime, member, validtime, plane, element, data)
 *  arguments:
 *   type1, type2, type3, member, plane, element: String
 *   basetime, validtime: Integer (minuits from 00:00 1 Jan 1801)
 *   data: NArray
 *  return:
 *   nil
 */
VALUE
rb_write(VALUE self,
         VALUE type1, VALUE type2, VALUE type3,
         VALUE basetime, VALUE member, VALUE validtime,
         VALUE plane, VALUE element,
         VALUE data)
{
  GetFullParams;

  struct NARRAY *cary;
  N_SI4 len;
  int code;
  char *fmt;

  if (!IsNArray(data))
    rb_raise(rb_eArgError, "data must be NArray");
  if (NA_RANK(data) != 2)
    rb_raise(rb_eArgError, "rank of data must be 2");
  GetNArray(data, cary);
  len = NA_TOTAL(data);

  fmt = natype_to_nusfmt(NA_TYPE(data));
  code = nusdas_write(ctype1, ctype2, ctype3,
                      &cbasetime, cmember, &cvalidtime,
                      cplane, celement,
                      cary->ptr, fmt, &len);
  if (code == len)
    return Qtrue;
  else if (code > 0)
    rb_raise(rb_eRuntimeError, "only %d/%d data were written", code, len);
  else if (code == -1)
    rb_raise(rb_eRuntimeError, "either member, plane, or element is invalid");
  else if (code == -2)
    rb_raise(rb_eRuntimeError, "writing is inhibited");
  else if (code == -3)
    rb_raise(rb_eRuntimeError, "data is too short");
  else if (code == -4)
    rb_raise(rb_eRuntimeError, "narray type is not adapted");
  else if (code == -5)
    rb_raise(rb_eRuntimeError, "data record length exceeded the fixd record length");
  else if (code == -6)
    rb_raise(rb_eRuntimeError, "the missing method and RLEN comprssion cannot be used togeter");
  else if (code == -7)
    rb_raise(rb_eRuntimeError, "encode error");

  return Qnil;
}