# Spain Playlist Analysis -- 02 Count Strams.r 
rm(DT.electro_latino_meta)

lib(ggplot2)
loadIfNotExists("DT.electro_latino")
loadIfNotExists("DT.electro_latino_meta")


DT.electro_latino_meta[, artist_track := sprintf("%3i: %20s - %-20s",  track_number_in_playlist, substr(gsub(",.*$", "", track.artist.namecsv), 1, 20), substr(track.name, 1, 20))]
DT.electro_latino_meta[, track.datetimeadded := as.POSIXct(track.datetimeadded, format="%Y-%m-%dT%H:%M:%SZ", tz="UTC")]
DT.electro_latino_today <- DT.electro_latino[tmstamp >= DT.electro_latino_meta[, max(track.datetimeadded)]]

## check all are allowed in the market
temp_DT.not_in_spain <- DT.electro_latino_meta[(!grepl("ES", track.album.markets) & track.album.markets != "") | (!grepl("ES", track.markets) & track.markets != "")]

if (nrow(temp_DT.not_in_spain)) {
  stop ("there are tracks not available in spain")
} else {
  DT.electro_latino_meta[, c("track.album.markets","track.markets") := NULL]
}

## Add track_number_in_playlist column
addColsFrom_(DT.electro_latino_today, DT.electro_latino_meta, joinCols.r="track_uri", joinCols.g="track.uri", colsToBring=c("track_number_in_playlist", "artist_track"))

## confirm track_number_in_playlist is unique by track
stopifnot(DT.electro_latino_today[!is.na(track_number_in_playlist), lunique(track_uri) == 1, keyby=(track_number_in_playlist)]$V1)

tmp_DT.tracks_with_no_number <- DT.electro_latino_today[is.na(track_number_in_playlist), .N, by=track_uri]
if (nrow(tmp_DT.tracks_with_no_number)) 
  warning(tmp_DT.tracks_with_no_number[, sprintf("There are %i tracks with no playlist track-number. %i have 1 stream.\nThe remaing %i have an average of %0.01f streams", .N, sum(N==1), sum(N!=1), mean(N[N!=1]))])

## These columns should be all the same and hence are superfluous. Drop them.
colsAllTheSame <- c("source", "source_uri")
DT.electro_latino_today[, sapply(.SD, lunique) == 1, .SDcols=colsAllTheSame] %>% nwhich %>% {DT.electro_latino_today[, (.) := NULL]}

## key first by user, then time, then track number. (Remember, time is every 15 minutes. Track numbers should be somewhat sequential)
kCols <- c("user_id", "tmstamp", "track_number_in_playlist")
setkeyIfNot(DT.electro_latino_today, kCols, verbose=FALSE)

DT.electro_latino_today[, total_tracks_streamed_by_user := .N, keyby=user_id ]
# DT.electro_latino_today[total_tracks_streamed_by_user > 3, min(track_number_in_playlist), by=user_id]

DT.electro_latino_today[!is.na(track_number_in_playlist), total_streams_per_track := .N, by=track_number_in_playlist]


## ~~~~~~~~~~~~~~~  QUICK LOOK AT GENDER DISTRIBUTION FOR TOTAL TRACKS BY USER ~~~~~~~~~~~~~~ ##
{
  title <- sprintf("Number of People streaming 'x' many tracks\noff of the Electro Latino playlist\nbetween %s ~ %s UTC (Capped to 40+ streams)", DT.electro_latino_today[, min(tmstamp)], DT.electro_latino_today[, max(tmstamp)])
  DT.plot <- DT.electro_latino_today[gender != "None", list(Number_of_users_streaming_this_many_streams=lunique(user_id)), keyby=list(gender, total_tracks_streamed_by_user)]
  DT.plot[total_tracks_streamed_by_user > 40, total_tracks_streamed_by_user := 40]
  DT.plot <- aggregateDT(DT.plot, by=c("gender", "total_tracks_streamed_by_user"), colsToAgg="Number_of_users_streaming_this_many_streams", showWarnings.info=FALSE)
  P.users_streaming_this_many_electro_latino_tracks <- ggBarchart2(DT.plot, x="total_tracks_streamed_by_user", fill="gender", y="Number_of_users_streaming_this_many_streams", width=0.9, title=title)
  ggsave.out(P.users_streaming_this_many_electro_latino_tracks, open=TRUE)
}
## ~~~~~~~~~~~~~~~  QUICK LOOK AT GENDER DISTRIBUTION FOR TOTAL TRACKS BY USER ~~~~~~~~~~~~~~ ##


## ~~~~~~~~~~~~~~~  QUICK LOOK AT GENDER DISTRIBUTION FOR TOTAL TRACKS BY USER ~~~~~~~~~~~~~~ ##
{
  first_N_tracks <- 80
  title <- sprintf("Number of Streams by Track Number\nElectro Latino playlist between %s ~ %s UTC\n(First %i tracks only)", DT.electro_latino_today[, min(tmstamp)], DT.electro_latino_today[, max(tmstamp)], first_N_tracks)
  DT.plot <- DT.electro_latino_today[!is.na(track_number_in_playlist), list(total_streams_per_track=unique(total_streams_per_track)), by=c("artist_track", "track_number_in_playlist")]
  DT.plot <- DT.plot[track_number_in_playlist <= first_N_tracks]
  setkeyIfNot(DT.plot, track_number_in_playlist, verbose=FALSE)

  DT.plot[, perc.drop_off_after_each_track := diffNA(total_streams_per_track, FALSE) / total_streams_per_track]

  DT.plot[, fifth := seq(.N) %% 5 == 0]
  DT.plot[, artist_track := reverseFactor(artist_track)]
  P.electro_latino_track_reordering <- ggBarchart2(DT.plot, x="artist_track", y="total_streams_per_track", width=1.2, title=title, geom="bar", alpha=0.5, fill="fifth", color=NULL, position="stack") + angledtext(0, 0) + relativetext(1, 0.5) + coord_flip()
  ggsave.out(P.electro_latino_track_reordering, open=TRUE)

}
## ~~~~~~~~~~~~~~~  QUICK LOOK AT GENDER DISTRIBUTION FOR TOTAL TRACKS BY USER ~~~~~~~~~~~~~~ ##




## TODO  Add user_access and device_type
##       However, it has to be added earlier so that it can be aggregated properly 
if (FALSE) {

  "This would go in around line 62"

  DT.plot <- DT.electro_latino_today[!is.na(track_number_in_playlist), list(total_streams_per_track=unique(total_streams_per_track)), by=list(artist_track, track_number_in_playlist, ad_supported = ifelse(user_access == 'free', 'ad-supported', 'premium'), desktop=ifelse(device_type == 'desktop', 'desktop', 'mobile'))]
}



  # ggBarchart2(DT.plot, x="track_number_in_playlist", fill=NULL, y="total_streams_per_track", width=0.9, title=title, geom="bar", alpha=0.2)
  # ggBarchart2(DT.plot, x="track_number_in_playlist", fill=NULL, y="perc.drop_off_after_each_track", width=0.9, title=title, geom="bar", alpha=0.2)
  # P.users_streaming_this_many_electro_latino_tracks <- ggBarchart2(DT.plot, x="user_streamed_this_many", fill="gender", y="N", width=0.9, title=title)
  # ggsave.out(P.users_streaming_this_many_electro_latino_tracks) %>% .o



