#' Identifies all Paxlovid prescriptions in the drug_exposure table
#' 
#' @param paxlovid_codeset codeset that contains paxlovid, ritonavir, and nirmatrelvir codes,
#'  with code_type column indicating which each code is.
#' @param drug_exposure_tbl the drug_exposure table
#' 
#' @return drug_exposure table that contains only 
#' paxlovid prescriptions. Nirmatrelvir and ritonavir 
#' prescriptions are counted as paxlovid only when they 
#' occur on the same date.
#' 
#' Function will perform string search on `drug_exposure_source_value`
#' Function will add a column called `drug_exposure_type` to 
#' annotate whether drug exposure was derived from structured code or 
#' source value derived
#' 

find_paxlovid <- function(paxlovid_codeset,
                               drug_exposure_tbl=cdm_tbl('drug_exposure')) {
  
  
  all_codes_paxlovid <- 
    drug_exposure_tbl %>%
    inner_join(
      select(paxlovid_codeset %>% filter(code_type=="paxlovid"),concept_id),
      by=c('drug_concept_id'='concept_id')
    ) %>% mutate(drug_exposure_type=2000001517L)  %>% compute_new(index="drug_exposure_id")
  
  all_codes_nirmatrelvir <- 
    drug_exposure_tbl %>%
    inner_join(
      select(paxlovid_codeset %>% filter(code_type=="nirmatrelvir"),concept_id),
      by=c('drug_concept_id'='concept_id')
    ) %>% mutate(drug_exposure_type=2000001517L)  %>% compute_new(index="drug_exposure_id")
  
  all_codes_ritonavir <- 
    drug_exposure_tbl %>%
    inner_join(
      select(paxlovid_codeset %>% filter(code_type=="ritonavir"),concept_id),
      by=c('drug_concept_id'='concept_id')
    ) %>% mutate(drug_exposure_type=2000001517L) %>% compute_new(index="drug_exposure_id")
  
  nirmatrelvir_person_dates<-all_codes_nirmatrelvir %>% distinct(person_id, drug_exposure_start_date) %>%
    rename(nirmatrelvir_date=drug_exposure_start_date) %>% compute_new(index="person_id")
  
  ritonavir_person_dates<-all_codes_ritonavir %>% distinct(person_id, drug_exposure_start_date) %>%
    rename(ritonavir_date=drug_exposure_start_date) %>% compute_new(index="person_id")
  
  codes_nirmatrelvir_keep<-all_codes_nirmatrelvir %>% 
    inner_join(ritonavir_person_dates, by=c("person_id", "drug_exposure_start_date"="ritonavir_date")) %>%
    compute_new(index="drug_exposure_id")
  
  codes_ritonavir_keep<-all_codes_ritonavir %>% 
    inner_join(nirmatrelvir_person_dates, by=c("person_id", "drug_exposure_start_date"="nirmatrelvir_date")) %>%
    compute_new(index="drug_exposure_id")
  
  all_codes<-all_codes_paxlovid %>%
    dplyr::union(codes_nirmatrelvir_keep) %>%
    dplyr::union(codes_ritonavir_keep)
  
  string_search <- 
    drug_exposure_tbl %>%
    filter(drug_concept_id == 0L &
             (str_detect(
               lower(drug_source_value),'paxlovid') |
               (str_detect(
                 lower(drug_source_value),'nirmatrelvir')&str_detect(
                   lower(drug_source_value),'ritonavir')))
    ) %>% compute_new(temporary=TRUE,
                      indexes=list('drug_concept_id',
                                   'person_id')) %>%
    mutate(drug_exposure_type=2000001519L)
  
  combined <- 
    dplyr::union(all_codes,
                 string_search) %>%
    mutate(value_as_concept_id = 2000001554L) %>%  
    compute_new(temporary=TRUE,
                indexes=list('person_id'))
  
  
}


#' Identifies all Remdesevir prescriptions in the drug_exposure table
#' 
#' @param remdesevir_codeset codeset that contains remdesevir codes
#' @param drug_exposure_tbl the drug_exposure table
#' 
#' @return drug_exposure table that contains only 
#' remdesevir prescriptions
#' 
#' Function will perform string search on `drug_exposure_source_value`
#' Function will add a column called `drug_exposure_type` to 
#' annotate whether drug exposure was derived from structured code or 
#' source value derived
#' 

find_remdesevir <- function(remdesevir_codeset,
                          drug_exposure_tbl=cdm_tbl('drug_exposure')) {
  
  
  all_remdesevir <- 
    drug_exposure_tbl %>%
    inner_join(
      select(remdesevir_codeset,concept_id),
      by=c('drug_concept_id'='concept_id')
    ) %>% mutate(drug_exposure_type=2000001517L)  
  
  string_search <- 
    drug_exposure_tbl %>%
    filter(drug_concept_id == 0L &
             str_detect(
               tolower(drug_source_value),'remdesivir|veklury')
    ) %>% compute_new(temporary=TRUE,
                      indexes=list('drug_concept_id',
                                   'person_id')) %>%
    mutate(drug_exposure_type=2000001519L)
  
  combined <- 
    dplyr::union(all_remdesevir,
                 string_search) %>%
    mutate(value_as_concept_id = 2000001553L) %>%  ### PLACEHOLDER: Remdesevir drug exposure
    compute_new(temporary=TRUE,
                indexes=list('person_id'))
  
  
}