pro mk_mdm, mdm, init=init, write=write, mk_list=mk_list
;
;
;HISTORY:
;	Written Jul-93 by M.Morrison
;	14-Jan-93 (MDM) - Patch for special case (93_52)
;	31-May-94 (MDM) - Modification to check that there is not a week missing 
;			  when generating the MDM database.
;	 7-Jun-94 (MDM) - Modified 31-May-94 logic since the ending
;			  time of "weeks" is always "today" and the last
;			  few weeks will always be missing.  Just want when
;			  missing in a series
;	20-Jun-94 (MDM) - Modified ^^ modification to RETURN, not STOP
;
size_side = 400 	;megabytes
;
weeks = week_loop('15-sep-91', !stime)
nmax = 500
gen_struct, mo_disk_map=mdm0
mdm = replicate(mdm0, nmax)
;
imdm = 0
used = 0
mo_disk = 0
nfid = 0
nparts = 1
stweek = 0
infil = concat_dir('$DIR_GEN_MO', 'mdm')
if (not keyword_set(init)) then begin
    restgen, mdm, file=infil
    imdm = n_elements(mdm)
    mdm = [mdm, replicate(mdm(0), nmax)]
    last_week = fix(strmid(string(mdm(imdm-1).st$week), 3, 2))
    last_year = fix(strmid(string(mdm(imdm-1).st$week), 0, 2))
    ss = where((weeks.year eq last_year) and (weeks.week eq last_week))
    stweek = ss(0)
    mo_disk = 2 * mdm(imdm-1).mo_disk + 1	;+1 to increment to the next side
    if (string(mdm(imdm-1).st$side) eq 'B') then mo_disk = mo_disk + 1		;if it was on side B, increment once more
end
;
start_fid = ''
side_arr = ['A', 'B', 'C', 'D', 'E']
ss2 = [2,3,5,6,7,8]             ;ada, bda, (no cba), hda, sfr, spr, wda
;
qfound_missing = 0
qfirst = 1
for iweek=stweek,n_elements(weeks)-1 do begin
    week = string(weeks(iweek).year, weeks(iweek).week, format="(i2.2,'_',i2.2)")
    fil = weekid(week, /xbd)
    wpart = 0	;week part (week can be broken up into 2-3 MO sides)
    ;
    if (fil eq '') then qfound_missing = 1
    if (fil ne '') then begin
	if (qfound_missing) then begin	;there was a week missing, and then one not missing
					;need to do this way because of way that the ending time is set to current time
	    message = ['MK_MDM:  Tried to process a week that did not exist.', $
		'Reformatting of weeks done out of order?', $
		'MDM database not updated']
	    mail, message, user='software@isass0', subj='MK_MDM Error'
	    return
	end

	print, 'Now Reading: ', fil
	rd_tapdir, fil, header, drec
	nfil = n_elements(drec)

	stifid = 0
        if (strpos(string(drec(0).fileid), '_') ne -1) then stifid = 1  ;skip week id

	if ((qfirst) and (not keyword_set(init))) then begin
	    ss = where(string(drec.fileid) eq string(mdm(imdm-1).st$last_fid))
	    stifid = ss(0) + 1
	    wpart = mdm(imdm-1).st$week(5)-97 + 1	;byte('a') = 97
	    qfirst = 0
	end

	if (stifid ge nfil) then begin
	    qfirst = 0	;special case which occured for 93_52 - mo disk boundary ended at the end of a week?
	end else begin
	    if (start_fid eq '') then start_fid = string(drec(stifid).fileid)

	    for ifid=stifid,nfil-1 do begin
		size_fid = 0
		for i=0,n_elements(ss2)-1 do size_fid = size_fid + drec(ifid).(ss2(i))/1e+6

		qwrite = 0
		if (used+size_fid gt size_side) then qwrite = 1	;next fid will not fit - write out what have

		if (qwrite) then begin
		    ;changes made here have to be made below too - sorry - bad coding
		    dattim = anytim2ints( fid2ex(start_fid) )
		    side = byte(side_arr(mo_disk mod 2))
		    if (nparts eq 1) then label = start_fid + strlowcase(side_arr(mo_disk mod 2))
		    mdm(imdm).time		= dattim.time
		    mdm(imdm).day		= dattim.day
		    mdm(imdm).mo_disk	= mo_disk/2
		    mdm(imdm).st$side	= side(0)
		    mdm(imdm).st$label	= byte(label)
		    mdm(imdm).st$week	= byte(week + strlowcase(side_arr(wpart)))
		    mdm(imdm).st$first_fid	= byte(start_fid)
		    mdm(imdm).st$last_fid	= byte(last_fid)
		    mdm(imdm).nfid		= nfid
		    imdm = imdm + 1

		    start_fid = string(drec(ifid).fileid)
		    used = 0
		    nfid = 0
		    mo_disk = mo_disk + 1	;otherwise, just go to the next side
		    nparts = 1
		    wpart = wpart + 1
		end
		used = used + size_fid
		nfid = nfid + 1
		last_fid = string(drec(ifid).fileid)
	    end

	    dattim = anytim2ints( fid2ex(start_fid) )
	    side = byte(side_arr(mo_disk mod 2))
	    if (nparts eq 1) then label = start_fid + strlowcase(side_arr(mo_disk mod 2))
	    mdm(imdm).time		= dattim.time
	    mdm(imdm).day		= dattim.day
	    mdm(imdm).mo_disk	= mo_disk/2
	    mdm(imdm).st$side	= side(0)
	    mdm(imdm).st$label	= byte(label)
	    mdm(imdm).st$week	= byte(week + strlowcase(side_arr(wpart)))
	    mdm(imdm).st$first_fid	= byte(start_fid)
	    mdm(imdm).st$last_fid	= byte(last_fid)
	    mdm(imdm).nfid		= nfid
	    imdm = imdm + 1

	    start_fid = ''		;clears it so that it get's set up above
	    nfid = 0
	    nparts = nparts + 1
	    if (used/size_side gt 0.96) then begin			;96% full and starting a new week
		used = 0
		mo_disk = mo_disk + 1
		nparts = 1
	    end
	end
    end
end
;
mdm = mdm(0:imdm-2)		;drop the last MO side because it might not be full
if (keyword_set(write)) then savegen, mdm, file=infil
;
if (keyword_set(mk_list)) then begin
    outfil1 = getenv('DIR_GEN_MO') + '/mo_list.txt'
    spawn, 'rm -f ' + outfil1
    mk_mo_list, outfil=outfil1
end
;
end

