*! eth_to_eth2grecal 1.1
*! Convert Ethiopian calendar dates to Gregorian calendar dates

program define eth2grecal
    version 16
    syntax [varlist], ///
        et_year(name) ///
        et_month(name) ///
        et_day(name)

    * Check if g_year, g_month, or g_day already exist in the data:
    capture confirm variable g_year
    if _rc == 0 {
        display "Error: Variable 'g_year' already exists in the dataset."
        exit 198
    }
    capture confirm variable g_month
    if _rc == 0 {
        display "Error: Variable 'g_month' already exists in the dataset."
        exit 198
    }
    capture confirm variable g_day
    if _rc == 0 {
        display "Error: Variable 'g_day' already exists in the dataset."
        exit 198
    }

    * Capture the variable names from the options
    local eth_year_var `et_year'
    local eth_month_var `et_month'
    local eth_day_var `et_day'

     * Check if these variables are numeric
     foreach var in `eth_year_var' `eth_month_var' `eth_day_var' {
     capture confirm numeric variable `var'
     if _rc != 0 {
     display as error "Error: Variable `var' must be numeric."
     exit 198
    	}
     }


	qui gen g_day = .	
	qui gen g_month = .	
	qui gen g_year = .
 
  
*************************************************************************************************
***CONVERT YEAR:
*************************************************************************************************
* IF NOT A LEAP YEAR IN ETHIOPIAN CALENDAR:	

	qui replace g_year = `eth_year_var' + 7 if inrange( `eth_month_var', 1, 3) & mod(`eth_year_var', 4) != 0 
	qui replace g_year = `eth_year_var' + 8 if inrange( `eth_month_var', 5, 13) & mod(`eth_year_var', 4) != 0 

* IF A LEAP YEAR IN ETHIOPIAN CALENDAR:	

	qui replace g_year = `eth_year_var' + 7 if inrange( `eth_month_var', 1, 3) & mod(`eth_year_var', 4) == 0 
	qui replace g_year = `eth_year_var' + 8 if inrange( `eth_month_var', 5, 13) & mod(`eth_year_var', 4) == 0 

*Exceptions for the 4th Ethiopian month (irrespective of whether a leap year or not):
	qui replace g_year = `eth_year_var' + 7 if inrange(`eth_day_var', 1, 21) &  `eth_month_var' == 4   
	qui replace g_year = `eth_year_var' + 8 if inrange(`eth_day_var', 23, 30) &  `eth_month_var' == 4   

*22nd day of the fourth month:
	qui replace g_year = `eth_year_var'+7 if `eth_day_var' == 22 &  `eth_month_var' == 4 & mod(`eth_year_var', 4) != 0     
	qui replace g_year = `eth_year_var'+8 if `eth_day_var' == 22 &  `eth_month_var' == 4 & mod(`eth_year_var', 4) == 0     
		
************************************************************************************************* 
***CONVERT DAY:
*************************************************************************************************

* IF NOT A LEAP YEAR IN ETHIOPIAN CALENDAR:	
	qui replace g_day=	`eth_day_var'+9 if inrange(`eth_day_var',1,22) &  `eth_month_var'== 4 & mod(`eth_year_var', 4) != 0 
	qui replace g_day=	`eth_day_var'-22 if inrange(`eth_day_var',23,30) &  `eth_month_var'== 4 & mod(`eth_year_var', 4) != 0 
	qui replace g_day=	`eth_day_var'-21 if inrange(`eth_day_var',22,30) &  `eth_month_var'== 6 & mod(`eth_year_var', 4) != 0 
	qui replace g_day=	`eth_day_var'+8 if inrange(`eth_day_var',1,23) &  `eth_month_var'== 5 & mod(`eth_year_var', 4) != 0 
	qui replace g_day=	`eth_day_var'+9 if inrange(`eth_day_var',1,22) &  `eth_month_var'== 7 & mod(`eth_year_var', 4) != 0 
	qui replace g_day=	`eth_day_var'-22 if inrange(`eth_day_var',23,30) &  `eth_month_var'== 7 & mod(`eth_year_var', 4) != 0 
	qui replace g_day=	`eth_day_var'-23 if inrange(`eth_day_var',24,30) &  `eth_month_var'== 5 & mod(`eth_year_var', 4) != 0 
	qui replace g_day=	`eth_day_var'+7 if inrange(`eth_day_var',1,21) &  `eth_month_var'== 6 & mod(`eth_year_var', 4) != 0 
	qui replace g_day=	`eth_day_var'+8 if inrange(`eth_day_var',1,22) &  `eth_month_var'== 8 & mod(`eth_year_var', 4) != 0 
	qui replace g_day=	`eth_day_var'-22 if inrange(`eth_day_var',23,30) &  `eth_month_var'== 8 & mod(`eth_year_var', 4) != 0 
	qui replace g_day=	`eth_day_var'+8 if inrange(`eth_day_var',1,23) &  `eth_month_var'== 9 & mod(`eth_year_var', 4) != 0 
	qui replace g_day=	`eth_day_var'-23 if inrange(`eth_day_var',24,30) &  `eth_month_var'== 9 & mod(`eth_year_var', 4) != 0 
	qui replace g_day=	`eth_day_var'+7 if inrange(`eth_day_var',1,23) &  `eth_month_var'== 10 & mod(`eth_year_var', 4) != 0 
	qui replace g_day=	`eth_day_var'-23 if inrange(`eth_day_var',24,30) &  `eth_month_var'== 10 & mod(`eth_year_var', 4) != 0 
	qui replace g_day=	`eth_day_var'+7 if inrange(`eth_day_var',1,24) &  `eth_month_var'== 11 & mod(`eth_year_var', 4) != 0 
	qui replace g_day=	`eth_day_var'-24 if inrange(`eth_day_var',25,30) &  `eth_month_var'== 11 & mod(`eth_year_var', 4) != 0 
	qui replace g_day = `eth_day_var' + 6 if inrange(`eth_day_var', 1, 25) &  `eth_month_var' == 12 & mod(`eth_year_var', 4) != 0 
	qui replace g_day = `eth_day_var' - 25 if inrange(`eth_day_var', 26, 30) &  `eth_month_var' == 12 & mod(`eth_year_var', 4) != 0 
	qui replace g_day = `eth_day_var' + 5 if inrange(`eth_day_var', 1, 6) &  `eth_month_var' == 13 & mod(`eth_year_var', 4) != 0 
	qui replace g_day = `eth_day_var' + 10 if inrange(`eth_day_var', 1, 20) &  `eth_month_var' == 1 & mod(`eth_year_var', 4) != 0 
	qui replace g_day = `eth_day_var' + 10 if inrange(`eth_day_var', 1, 20) &  `eth_month_var' == 1 & mod(`eth_year_var', 4) != 0 
	qui replace g_day = `eth_day_var' - 20 if inrange(`eth_day_var', 21, 30) &  `eth_month_var' == 1 & mod(`eth_year_var', 4) != 0 
	qui replace g_day = `eth_day_var' + 10 if inrange(`eth_day_var', 1, 21) &  `eth_month_var' == 2 & mod(`eth_year_var', 4) != 0 
	qui replace g_day = `eth_day_var' - 21 if inrange(`eth_day_var', 22, 30) &  `eth_month_var' == 2 & mod(`eth_year_var', 4) != 0 
	qui replace g_day = `eth_day_var' + 9 if inrange(`eth_day_var', 1, 21) &  `eth_month_var' == 3 & mod(`eth_year_var', 4) != 0 
	qui replace g_day = `eth_day_var' - 21 if inrange(`eth_day_var', 22, 30) &  `eth_month_var' == 3 & mod(`eth_year_var', 4) != 0 

* IF A LEAP YEAR IN ETHIOPIAN CALENDAR:
	qui replace g_day =	`eth_day_var'+10 if inrange(`eth_day_var', 1, 21) &  `eth_month_var'== 4 & mod(`eth_year_var', 4) == 0 
	qui replace g_day =	`eth_day_var'-21 if inrange(`eth_day_var', 22, 30) &  `eth_month_var'==	4 & mod(`eth_year_var', 4) == 0 
	qui replace g_day =	`eth_day_var'+8	if inrange(`eth_day_var', 1, 23) &  `eth_month_var'==5 & mod(`eth_year_var', 4) == 0 
	qui replace g_day =	`eth_day_var'-23 if inrange(`eth_day_var', 24, 30) &  `eth_month_var'==5 & mod(`eth_year_var', 4) == 0 
	qui replace g_day = `eth_day_var' + 7 if inrange(`eth_day_var', 1, 21) &  `eth_month_var' == 6 & mod(`eth_year_var', 4) == 0 
	qui replace g_day = `eth_day_var' - 21 if inrange(`eth_day_var', 22, 30) &  `eth_month_var' == 6 & mod(`eth_year_var', 4) == 0 
	qui replace g_day = `eth_day_var' + 9 if inrange(`eth_day_var', 1, 22) &  `eth_month_var' == 7 & mod(`eth_year_var', 4) == 0 
	qui replace g_day = `eth_day_var' - 22 if inrange(`eth_day_var', 23, 30) &  `eth_month_var' == 7 & mod(`eth_year_var', 4) == 0 
	qui replace g_day = `eth_day_var' + 8 if inrange(`eth_day_var', 1, 22) &  `eth_month_var' == 8 & mod(`eth_year_var', 4) == 0 
	qui replace g_day = `eth_day_var' - 22 if inrange(`eth_day_var', 23, 30) &  `eth_month_var' == 8 & mod(`eth_year_var', 4) == 0 
	qui replace g_day =	`eth_day_var' + 8 if inrange(`eth_day_var', 1, 23) &  `eth_month_var'== 9	& mod(`eth_year_var', 4) == 0  
	qui replace g_day =	`eth_day_var' - 23 if inrange(`eth_day_var', 24, 30) &  `eth_month_var'== 9 & mod(`eth_year_var', 4) == 0  
	qui replace g_day = `eth_day_var' + 7 if inrange(`eth_day_var', 1, 23) &  `eth_month_var' == 10 & mod(`eth_year_var', 4) == 0 
	qui replace g_day = `eth_day_var' - 23 if inrange(`eth_day_var', 24, 30) &  `eth_month_var' == 10 & mod(`eth_year_var', 4) == 0 
	qui replace g_day = `eth_day_var' + 7 if inrange(`eth_day_var', 1, 24) &  `eth_month_var' == 11 & mod(`eth_year_var', 4) == 0 
	qui replace g_day = `eth_day_var' - 24 if inrange(`eth_day_var', 25, 30) &  `eth_month_var' == 11 & mod(`eth_year_var', 4) == 0 
	qui replace g_day = `eth_day_var' + 6 if inrange(`eth_day_var', 1, 25) &  `eth_month_var' == 12 & mod(`eth_year_var', 4) == 0 
	qui replace g_day = `eth_day_var' - 25 if inrange(`eth_day_var', 26, 30) &  `eth_month_var' == 12 & mod(`eth_year_var', 4) == 0 
	qui replace g_day = `eth_day_var' + 5 if inrange(`eth_day_var', 1, 5) &  `eth_month_var' == 13 & mod(`eth_year_var', 4) == 0 
	qui replace g_day =	`eth_day_var' + 11 if inrange(`eth_day_var', 1, 19) &  `eth_month_var'==	1 & mod(`eth_year_var', 4) == 0 
	qui replace g_day =	`eth_day_var' - 19 if inrange(`eth_day_var', 20, 30) &  `eth_month_var'==	1 & mod(`eth_year_var', 4) == 0 
	qui replace g_day =	`eth_day_var' + 11 if inrange(`eth_day_var', 1, 20) &  `eth_month_var'==	2 & mod(`eth_year_var', 4) == 0 
	qui replace g_day =	`eth_day_var' - 20 if inrange(`eth_day_var', 21, 30) &  `eth_month_var'==	2 & mod(`eth_year_var', 4) == 0 
	qui replace g_day =	`eth_day_var' + 10 if inrange(`eth_day_var', 1, 20) &  `eth_month_var'==	3 & mod(`eth_year_var', 4) == 0 
	qui replace g_day =	`eth_day_var' - 20 if inrange(`eth_day_var', 21, 30) &  `eth_month_var'==	3 & mod(`eth_year_var', 4) == 0 
	qui replace g_day = 11 if `eth_day_var' == 6 &  `eth_month_var' == 13 & mod(`eth_year_var', 4) == 0 

*Exceptions due to leap years in either calendar or if the previous Ethiopian year was a leap year:
	qui replace g_day = 1 if `eth_day_var'== 22 &  `eth_month_var'== 4 & mod(`eth_year_var', 4) != 0  & mod(`eth_year_var'-1, 4) != 0  & (mod(g_year, 4) == 0 & (mod(g_year, 100) != 0 | mod(g_year, 400) == 0))
	qui replace g_day =	`eth_day_var'+9 if inrange(`eth_day_var', 1,22) &  `eth_month_var'== 5 & mod(`eth_year_var', 4) == 0  & (mod(g_year, 4) == 0 & (mod(g_year, 100) != 0 | mod(g_year, 400) == 0))
	qui replace g_day = `eth_day_var'-22 if inrange(`eth_day_var', 23,30) &  `eth_month_var'== 5 & mod(`eth_year_var', 4) == 0  & (mod(g_year, 4) == 0 & (mod(g_year, 100) != 0 | mod(g_year, 400) == 0))
	qui replace g_day = `eth_day_var'+8 if inrange(`eth_day_var', 1,21) &  `eth_month_var'== 6 & mod(`eth_year_var', 4) == 0  & (mod(g_year, 4) == 0 & (mod(g_year, 100) != 0 | mod(g_year, 400) == 0))

*************************************************************************************************						
***CONVERT MONTH:
*************************************************************************************************						
* IF NOT A LEAP YEAR IN ETHIOPIAN CALENDAR:	

	qui replace g_month = 1 if inrange(`eth_day_var', 23, 30) &  `eth_month_var' == 4 & mod(`eth_year_var', 4) != 0 

	qui replace g_month = 1 if inrange(`eth_day_var', 1, 23) &  `eth_month_var' == 5 & mod(`eth_year_var', 4) != 0 
	qui replace g_month = 2 if inrange(`eth_day_var', 24, 30) &  `eth_month_var' == 5 & mod(`eth_year_var', 4) != 0 
	
	qui replace g_month = 2 if inrange(`eth_day_var', 1, 21) &  `eth_month_var' == 6 & mod(`eth_year_var', 4) != 0 
	qui replace g_month = 3 if inrange(`eth_day_var', 22, 30) &  `eth_month_var' == 6 & mod(`eth_year_var', 4) != 0 

 	qui replace g_month = 3 if inrange(`eth_day_var', 1, 22) &  `eth_month_var' == 7 & mod(`eth_year_var', 4) != 0 
	qui replace g_month = 4 if inrange(`eth_day_var', 23, 30) &  `eth_month_var' == 7 & mod(`eth_year_var', 4) != 0 	
	
 	qui replace g_month = 4 if inrange(`eth_day_var', 1, 22) &  `eth_month_var' == 8 & mod(`eth_year_var', 4) != 0 
	qui replace g_month = 5 if inrange(`eth_day_var', 23, 30) &  `eth_month_var' == 8 & mod(`eth_year_var', 4) != 0 	

  	qui replace g_month = 5 if inrange(`eth_day_var', 1, 23) &  `eth_month_var' == 9 & mod(`eth_year_var', 4) != 0 
	qui replace g_month = 6 if inrange(`eth_day_var', 24, 30) &  `eth_month_var' == 9 & mod(`eth_year_var', 4) != 0 		

  	qui replace g_month = 6 if inrange(`eth_day_var', 1, 23) &  `eth_month_var' == 10 & mod(`eth_year_var', 4) != 0 
	qui replace g_month = 7 if inrange(`eth_day_var', 24, 30) &  `eth_month_var' == 10 & mod(`eth_year_var', 4) != 0 			
	
  	qui replace g_month = 7 if inrange(`eth_day_var', 1, 24) &  `eth_month_var' == 11 & mod(`eth_year_var', 4) != 0 
	qui replace g_month = 8 if inrange(`eth_day_var', 25, 30) &  `eth_month_var' == 11 & mod(`eth_year_var', 4) != 0 		

  	qui replace g_month = 8 if inrange(`eth_day_var', 1, 25) &  `eth_month_var' == 12 & mod(`eth_year_var', 4) != 0 
	qui replace g_month = 9 if inrange(`eth_day_var', 26, 30) &  `eth_month_var' == 12 & mod(`eth_year_var', 4) != 0 		
 
	qui replace g_month = 9 if inrange(`eth_day_var', 1, 6) &  `eth_month_var' == 13 & mod(`eth_year_var', 4) != 0 		

  	qui replace g_month = 9 if inrange(`eth_day_var', 1, 20) &  `eth_month_var' == 1 & mod(`eth_year_var', 4) != 0 
	qui replace g_month = 10 if inrange(`eth_day_var', 21, 30) &  `eth_month_var' == 1 & mod(`eth_year_var', 4) != 0 		

  	qui replace g_month = 10 if inrange(`eth_day_var', 1, 21) &  `eth_month_var' == 2 & mod(`eth_year_var', 4) != 0 
	qui replace g_month = 11 if inrange(`eth_day_var', 22, 30) &  `eth_month_var' == 2 & mod(`eth_year_var', 4) != 0 		

  	qui replace g_month = 11 if inrange(`eth_day_var', 1, 21) &  `eth_month_var' == 3 & mod(`eth_year_var', 4) != 0 
	qui replace g_month = 12 if inrange(`eth_day_var', 22, 30) &  `eth_month_var' == 3 & mod(`eth_year_var', 4) != 0 		

  	qui replace g_month = 12 if inrange(`eth_day_var', 1, 22) &  `eth_month_var' == 4 & mod(`eth_year_var', 4) != 0 

 
*** IF A LEAP YEAR IN ETHIOPIAN CALENDAR

	qui replace g_month = 1 if inrange(`eth_day_var', 22, 30) &  `eth_month_var' == 4 & mod(`eth_year_var', 4) == 0 
	
	qui replace g_month = 1 if inrange(`eth_day_var', 1, 23) &  `eth_month_var' == 5 & mod(`eth_year_var', 4) == 0 
	qui replace g_month = 2 if inrange(`eth_day_var', 24, 30) &  `eth_month_var' == 5 & mod(`eth_year_var', 4) == 0 

	qui replace g_month = 2 if inrange(`eth_day_var', 1, 21) &  `eth_month_var' == 6 & mod(`eth_year_var', 4) == 0 
	qui replace g_month = 3 if inrange(`eth_day_var', 22, 30) &  `eth_month_var' == 6 & mod(`eth_year_var', 4) == 0 

	qui replace g_month = 3 if inrange(`eth_day_var', 1, 22) &  `eth_month_var' == 7 & mod(`eth_year_var', 4) == 0 
	qui replace g_month = 4 if inrange(`eth_day_var', 23, 30) &  `eth_month_var' == 7 & mod(`eth_year_var', 4) == 0 

	qui replace g_month = 4 if inrange(`eth_day_var', 1, 22) &  `eth_month_var' == 8 & mod(`eth_year_var', 4) == 0 
	qui replace g_month = 5 if inrange(`eth_day_var', 23, 30) &  `eth_month_var' == 8 & mod(`eth_year_var', 4) == 0 

	qui replace g_month = 5 if inrange(`eth_day_var', 1, 23) &  `eth_month_var' == 9 & mod(`eth_year_var', 4) == 0 
	qui replace g_month = 6 if inrange(`eth_day_var', 24, 30) &  `eth_month_var' == 9 & mod(`eth_year_var', 4) == 0 

	qui replace g_month = 6 if inrange(`eth_day_var', 1, 23) &  `eth_month_var' == 10 & mod(`eth_year_var', 4) == 0 
	qui replace g_month = 7 if inrange(`eth_day_var', 24, 30) &  `eth_month_var' == 10 & mod(`eth_year_var', 4) == 0 

	qui replace g_month = 7 if inrange(`eth_day_var', 1, 24) &  `eth_month_var' == 11 & mod(`eth_year_var', 4) == 0 
	qui replace g_month = 8 if inrange(`eth_day_var', 25, 30) &  `eth_month_var' == 11 & mod(`eth_year_var', 4) == 0 

	qui replace g_month = 8 if inrange(`eth_day_var', 1, 25) &  `eth_month_var' == 12 & mod(`eth_year_var', 4) == 0 
	qui replace g_month = 9 if inrange(`eth_day_var', 26, 30) &  `eth_month_var' == 12 & mod(`eth_year_var', 4) == 0 

	qui replace g_month = 9 if inrange(`eth_day_var', 1, 6) &  `eth_month_var' == 13 & mod(`eth_year_var', 4) == 0 
	
	qui replace g_month = 9 if inrange(`eth_day_var', 1, 20) &  `eth_month_var' == 1 & mod(`eth_year_var', 4) == 0 
	qui replace g_month = 10 if inrange(`eth_day_var', 21, 30) &  `eth_month_var' == 1 & mod(`eth_year_var', 4) == 0 
	
	qui replace g_month = 10 if inrange(`eth_day_var', 1, 21) &  `eth_month_var' == 2 & mod(`eth_year_var', 4) == 0 
	qui replace g_month = 11 if inrange(`eth_day_var', 22, 30) &  `eth_month_var' == 2 & mod(`eth_year_var', 4) == 0 
	
	qui replace g_month = 11 if inrange(`eth_day_var', 1, 21) &  `eth_month_var' == 3 & mod(`eth_year_var', 4) == 0 
	qui replace g_month = 12 if inrange(`eth_day_var', 22, 30) &  `eth_month_var' == 3 & mod(`eth_year_var', 4) == 0 
	
	qui replace g_month = 12 if inrange(`eth_day_var', 1, 21) &  `eth_month_var' == 4 & mod(`eth_year_var', 4) == 0 
	
	*Exceptions due to leap years in either calendar or if previous year in Ethiopian calendar was a leap year:
 	qui replace g_month = 10 if `eth_day_var' == 20 &   `eth_month_var' == 1 & mod(`eth_year_var', 4) == 0  & mod(`eth_year_var'-1, 4) != 0  & mod(g_year, 4) != 0
	qui replace g_month = 11 if `eth_day_var' == 21 &   `eth_month_var' == 2 & mod(`eth_year_var', 4) == 0  & mod(`eth_year_var'-1, 4) != 0  & mod(g_year, 4) != 0 
	qui replace g_month = 12 if `eth_day_var' == 21 &   `eth_month_var' == 3 & mod(`eth_year_var', 4) == 0  & mod(`eth_year_var'-1, 4) != 0  & mod(g_year, 4) != 0 
	qui replace g_month = 1 if `eth_day_var' == 22 &   `eth_month_var' == 4 & mod(`eth_year_var', 4) == 0  & mod(`eth_year_var'-1, 4) != 0  & mod(g_year, 4) != 0 
	qui replace g_month = 2 if `eth_day_var' == 23 &   `eth_month_var' == 5 & mod(`eth_year_var', 4) == 0  & mod(`eth_year_var'-1, 4) != 0  & (mod(g_year, 4) == 0 & (mod(g_year, 100) != 0 | mod(g_year, 400) == 0))
	qui replace g_month = 1 if `eth_day_var' == 23 &   `eth_month_var' == 5 & mod(`eth_year_var', 4) != 0  & mod(`eth_year_var'-1, 4) == 0  & mod(g_year, 4) != 0 

	
*************************************************************************************************						
***CHECKS AND VARIABLE LABELS:
*************************************************************************************************		
	
    	* Check if any of the original Ethiopian date observations are missing or have any oddities. If yes, set all Gregorian dates missing
	qui foreach var of varlist g_year g_month g_day {
    	replace `var' = . if missing(`eth_year_var') | missing(`eth_month_var') | missing(`eth_day_var')
	replace `var' = . if !inrange(`eth_day_var', 1, 30)
	replace `var' = . if !inrange(`eth_month_var', 1, 13)
	replace `var' = . if `eth_month_var'==13 & !inrange(`eth_day_var', 1, 6)

	}
 
	* Check if the year variable is outside the range 1901-2099 and display a warning if so
	if sum(g_year <= 1900 | g_year >= 2100) > 0 {
    	display as err "Warning: The Gregorian year variable contains values outside the range 1901-2099. These Gregorian calendar dates have been set missing."

    	* Check if any of the original Ethiopian date observations are missing. If yes, set all Gregorian dates missing
	qui foreach var of varlist g_year g_month g_day {
    	replace `var' = . if g_year <= 1900 | g_year >= 2100
	}

}
	* Label the variables that were created
	label var g_year "Gregorian calendar year"
	label var g_day "Gregorian calendar day"
	label var g_month "Gregorian calendar month"
	 
	 
     * End of program
end