# spotify overview.r


## The different filters will pick up differntly
##  track_album_artist will pick up those tracks where track_artists is blank
##  track_artists will pick up compilations (ie track_album_artist = 'Various Artists' etc)



.spotify_album_and_artist_cols <- function(tracks=TRUE, track_name=tracks, track_artists=tracks, isrc=tracks) {
  c("upc", "album_name", "track_album_artist", if (track_artists) "track_artists", if (isrc) "isrc",  if (track_name) "track_name")
}


.spotify_make_artistname_filter <- function(artistname, filterBy, choices=c("track_album_artist", "track_artists"), conjunction=c("OR", "AND"), ignore.case=TRUE) {
  if (tolower(filterBy) == "both")
    filterBy <- choices
  else
    filterBy <- match.arg(filterBy, choices=choices)

  ## avoid duplicates in artist name for cleaner queries
  if (ignore.case)
    artistname %<>% {.[!duplicated(tolower(.))]}
  else 
    artistname %<>% {.[!duplicated(.)]}

  ## use ILIKE or LIKE, depending on ignore.case
  like <- if (ignore.case) "ILIKE" else "LIKE"

  ## clean the conjunction
  conjunction %<>% .clean_conjunction

  ## iterate over filterBy
  filterBy %>% sapply(function(x) sprintf(fmt="%s %s '%s'", x, like, artistname)) %>% pasteC(C=conjunction) %>% sprintf("(%s)", .)
}

.spotify_fill_blank_track_artists_ <- function(DT, add_bool_col=TRUE, fillblankartists=TRUE) {
## This function can be called such that it has no affect on the DT if conditions are not appropriate for modification
## fillblankartists :: a flag, generally set in the params to the calling function, where if not TRUE, no changes are made. 

  if (!isTRUE(fillblankartists))
    return(invisible(DT))
  if (!all(c("track_album_artist", "track_artists") %in% names(DT)))
    return(invisible(DT))

  DT[, track_artists_was_blank := track_artists == ""]
  DT[(track_artists_was_blank), track_artists := track_album_artist]

  if (!isTRUE(add_bool_col))
    DT[, track_artists_was_blank := NULL]

  return(invisible(DT))
}

get_spotify_artist_overview <- function(artistname, colsToPull=.spotify_album_and_artist_cols(tracks=tracks), colsToAgg=c(units="*"), tracks=TRUE, limit=NULL, cluster=NULL, verbose=TRUE, filterBy=c("both", "track_album_artist", "track_artists"), fillblankartists=TRUE, ...) {

  if ("filterby" %in% names(list(...)))
    warning ("Found 'filterby' in list(...)\nDid you mean 'filterBy'  -- with capital-B ?")

  tbl.spot <- "staging_raw_spotify_v2"
  schema.spot <- "production"

  # filterBy <- match.arg(filterBy)
  # artistname %<>% {.[!duplicated(tolower(.))]}
  # where.artists <- sprintf("%s ILIKE '%s'", filterBy, artistname) %>% pasteC(C=" OR ")

  where.artists <- .spotify_make_artistname_filter(artistname=artistname, filterBy=filterBy)

  makeQry(tbl=tbl.spot, distinct=TRUE, colsToAgg=colsToAgg, colsToPull=colsToPull,  where=where.artists, schema=schema.spot, limit=limit, key=NULL, ...) %>% 
    runQry(cluster=cluster, verbose=verbose) %>% 
    .spotify_fill_blank_track_artists_(fillblankartists=fillblankartists)  %>% 
    {.}
}

get_spotify_artist_detail <- function(artistname, limit=NULL, cluster=NULL, verbose=TRUE, filterBy=c("both", "track_album_artist", "track_artists"), fillblankartists=TRUE, ...) {

  tbl.spot <- "staging_raw_spotify_v2"
  schema.spot <- "production"

  if ("filterby" %in% names(list(...)))
    warning ("Found 'filterby' in list(...)\nDid you mean 'filterBy'  -- with capital-B ?")

  # filterBy <- match.arg(filterBy)
  # artistname %<>% {.[!duplicated(tolower(.))]}
  # where.artists <- sprintf("%s ILIKE '%s'", filterBy, artistname) %>% pasteC(C=" OR ")

  where.artists <- .spotify_make_artistname_filter(artistname=artistname, filterBy=filterBy)


  colsDontPull  <- c("version", "track_uri", "message", "track_message", "row_id", "user_type")
  colsToPull    <- "*"
  colsToAgg     <- c(units="*")

  makeQry(tbl=tbl.spot, artistid=id.bane, schema=schema.spot, colsToAgg=colsToAgg, colsToPull=colsToPull, colsDontPull=colsDontPull, limit=limit, key=NULL) %>%
    runQry(allow.large.groupby=TRUE, cluster=cluster, verbose=verbose) %>% 
    .spotify_fill_blank_track_artists_(fillblankartists=fillblankartists)  %>% 
    {.}
}

## TESTING pipe with .spotify_make_artistname_filter()
if (FALSE) {
  test <- function(DT, fillblankartists=TRUE) {
    DT %>% cbind(new_col="hello") %>% rbind(data.table(track_album_artist = "This is a test", track_artists=""), fill=TRUE) %>%
      .spotify_fill_blank_track_artists_(fillblankartists=fillblankartists)  %>% 
      {.}
  }
  DT.overview <- get_spotify_artist_overview("bane", fillblankartists=FALSE)
  test(DT.overview, FALSE)
  test(DT.overview, TRUE)
}


get_radial_usernames <- function() {
  c("theorchardus","114125244","radiallatinoamerica","clubcorridos","theorchardscandinavia","1113004802","radialphilippines","radialturkey","radialitalia","radialdeutschland","radialmexico","radialbrasil","radialgreece","radialaustralia","radialcanada","radialindonesia","theorcharduk")
}

playlist_uri_is_radial <- function(uri) {
  get_radial_usernames() %>% sprintf("user:%s:", .) %>% regOr(escape=TRUE) %>% grepl(uri)
}

## COLUMNS IN  staging_raw_spotify_v2
#     [1,] "album_code"
#     [2,] "album_name"
#     [3,] "birth_year"
#     [4,] "cached"
#     [5,] "device_type"
#     [6,] "download_date"
#     [7,] "gender"
#     [8,] "isrc"
#     [9,] "length"
#    [10,] "message"
#    [11,] "offline_timestamp"
#    [12,] "os"
#    [13,] "partner"
#    [14,] "product"
#    [15,] "referral"
#    [16,] "row_id"
#    [17,] "source"
#    [18,] "source_uri"
#    [19,] "tmstamp"
#    
#    [20,] "track_album_artist"
#    [21,] "track_artists"
#    [22,] "track_id"
#    [23,] "track_message"
#    [24,] "track_name"
#    [25,] "track_uri"
#    [26,] "upc"
#    
#    [27,] "user_access"
#    [28,] "user_country"
#    [29,] "user_id"
#    [30,] "user_message"
#    [31,] "user_region"
#    [32,] "user_type"
#    [33,] "version"
#    [34,] "zipcode"



