;+
;NAME: barrel_write_config
;
;DESCRIPTION: 
;  Writes the barrel_config file
;
;REQUIRED INPUTS:
; none (filename is hardcoded, 'barrel_config.txt', and is put in a folder
;   given by the routine 'barrel_config_filedir', that uses the IDL routine
;   app_user_dir to create/obtain it:
; e.g. (MacOS X)
;   /Users/username/.idl/themis/barrel_config-4_darwin
;
;KEYWORD ARGUMENTS (OPTIONAL):
; COPY:         If set, make a copy, creating a new file whose filename 
;       is timestamped with an appended !STIME.
;
;OUTPUT
; the file is written, and a copy of any old file is generated 
;
;STATUS:
;
;TO BE ADDED: n/a
;
;EXAMPLE:
;
;REVISION HISTORY:
;Version 0.90a KBY 04/19/2013 no changes
;Version 0.84 KBY 12/04/2012 added header 
;Version 0.83 KBY 12/04/2012 initial beta release 
;Version 0.80 KBY 10/29/2012 from 'goesmag/goes_write_config.pro' by JWL(?)
;-

PRO barrel_write_config, copy=copy, _extra=_extra
    otp = -1    ; doesn't do anything here..
    ; get the filename
    dir = barrel_config_filedir()
    ll = strmid(dir, strlen(dir)-1,1)
    if (ll EQ '/' or ll EQ '\') then filex = dir+'barrel_config.txt' $
      else filex = dir + PATH_SEP() + 'barrel_config.txt'
  
    ; if we are copying the file, get a filename, header, and old configuration
    if (keyword_set(copy)) then begin
        xt = time_string(systime(/sec))
        ttt = strmid(xt, 0, 4) + strmid(xt, 5, 2) + strmid(xt, 8, 2) + $
          '_' + strmid(xt, 11, 2) + strmid(xt, 14, 2) + strmid(xt, 17, 2)
        filex_out = filex + '_' + ttt
        cfg = barrel_read_config(header = hhh)
    endif else begin
        ; does the file exist?  if so, then copy it
        if (file_search(filex) NE '') then barrel_write_config, /copy
        filex_out = filex
        cfg = {local_data_dir:!barrel.local_data_dir, $
            remote_data_dir:!barrel.remote_data_dir, $
            no_download:!barrel.no_download, $
            no_update:!barrel.no_update, $
            downloadonly:!barrel.downloadonly, $
            user_agent:!barrel.user_agent, $
            verbose:!barrel.verbose}

        hhh = [';barrel_config.txt', '; BARREL configuration file', $
            ';Created'+time_string(systime(/sec))]
    endelse

    ; you need to be sure that the directory exists
    xdname = file_dirname(filex_out)
    if (xdname NE '') then file_mkdir, xdname

    ; write the file
    ;   write header
    openw, unit, filex_out, /get_lun
    for j=0, n_elements(hhh)-1 do printf, unit, hhh[j]
    ;   write configuration information
    ctags = tag_names(cfg)
    nctags = n_elements(ctags)
    for j=0, nctags-1 do begin
        x0 = strtrim(ctags[j])  ; field tag
        x1 = cfg.(j)            ; associated data
        if (is_string(x1)) then x1 = strtrim(x1,2) else begin
            ; odd things can happen with byte arrays-- convert to integer type
            if (size(x1, /type) EQ 1) then x1 = fix(x1)
            x1 = strcompress(/remove_all, string(x1))
        endelse
        printf, unit, x0 + '=' + x1
    endfor

    FREE_LUN, unit
    RETURN

END