/***********************************************************************/
 /* lastdate - itt, at                                                  */
 /* ITT - death date, end of enrollment, end of data                    */
 /* AT - death, end of enrollment, end of data, exposure end/switch     */
 /* 021.lastdate                                                        */
 /***********************************************************************/

 data ids(rename=(class = index_class));
  set out.dm_cohort(rename=(enr_end = enddt));
 end_data = '31Dec2019'd;
 lastdate = min( deathdt, enddt,end_data);
 dur = lastdate - indexdt;
 keep patid indexdt class lastdate;
 run;

 %macro temp;

 %do year = 2012 %to 2019;

 data rx&year;
    set in.dispensing&year(keep = patid generic Dispense_Date DISPENSE_SUP);
 generic = left(lowcase(generic));

 if substr(generic,1,  11 )  =  'sitagliptin'       or
     substr(generic,1, 11 )  =  'saxagliptin'       or
     substr(generic,1, 11 )  =  'linagliptin'       or
     substr(generic,1, 10 )  =  'alogliptin'        then class = 'DPP4 ';

 if substr(generic,1,  13 )  =  'empagliflozin'       or
     substr(generic,1, 13 )  =  'canagliflozin'       or
     substr(generic,1, 13 )  =  'dapagliflozin'       or
     substr(generic,1, 13 )  =  'ertugliflozin'       then class ='SGLT2';
 if class ^= ' ';
 keep patid Dispense_Date generic class DISPENSE_SUP;
 run;

 %end;

 data dm_meds;
    set  %do year = 2012 %to 2019;
                  rx&year
         %end;
        ;
 run;

 %mend;
 %temp;

 proc sort nodup;
   by patid dispense_date generic;
 run;

data meds_after;
   merge dm_meds(in = in1 rename=(dispense_date = rxdate DISPENSE_SUP =rxsup))
         ids(in = in2);
   by patid;
   if in1 and in2;
if indexdt <= rxdate <= lastdate;
keep patid indexdt rxdate class lastdate index_class rxsup;
run;

data index_meds other_meds;
    set meds_after;
if class = index_class then output index_meds;
else                        output other_meds;
run;


  proc sort nodup data = index_meds;
     by patid indexdt rxdate rxsup;
  run;

  data array_index;
     set index_meds;
     by patid indexdt;
     retain a1-a2810 ;
     array days{2810} a1-a2810;
     if first.indexdt then do i = 1 to 2810;
           days(i) = 0;
     end;
     lastday = lastdate - indexdt + 1;
     start   = rxdate - indexdt + 1;
     end     = start + (rxsup + 30);
     do j = start to end until (j = lastday);
           days(j) = 1;
     end;
    if last.indexdt then output;
  keep patid indexdt a1-a2810 lastday;
  run;

   data  exposure_end;
     set array_index;
   array drugs{2810} a1-a2810;
   do i = 1 to 2810;
           if drugs(i) = 0 or i = lastday then do;
               output;
               i = 6000;
           end;
  end;
  keep patid indexdt i;
  run;


  proc sort data = exposure_end;
     by patid indexdt i;
  run;

  proc sort nodupkey data = exposure_end;
     by patid indexdt;
  run;

  data index_exposure_end;
           set exposure_end;
  if i ^= . then index_exposure_end = indexdt + i - 1;
  keep patid indexdt index_exposure_end ;
  run;

data exposure_switch(rename=(rxdate = switch_date));
    merge other_meds(in = in1 keep = patid indexdt rxdate)
          index_exposure_end(in = in2);
    by patid;
    if in1 and in2;
  if indexdt <= rxdate <= index_exposure_end;
  keep patid indexdt rxdate;
 run;

 proc sort data = exposure_switch;
    by patid indexdt switch_date;
 run;

 proc sort nodupkey data = exposure_switch;
    by patid indexdt;
 run;


  data out.lastdate(rename=(index_class = class));
        merge ids(in = in1 keep = patid indexdt index_class lastdate)
              index_exposure_end(keep= patid index_exposure_end)
              exposure_switch(keep= patid switch_date);
        by patid;
        if in1;
   lastdate = min(lastdate, index_exposure_end, switch_date);
  keep patid indexdt index_class lastdate;
  run;