package Ġde . f kl app an . app . work out log . domain . use cases Ċ Ċ import Ġde . f kl app an . app . work out log . domain .* Ċ import Ġio . reactivex . Single Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . HashSet Ċ import Ġkotlin . math . max Ċ Ċ class ĠGet Statistic UseCase ( val Ġrepository : ĠWork out Log Repository ) Ġ: ĠUse Case < Calendar , ĠStat istic Current Domain Model > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġexecute ( start Day Ġ: ĠCalendar ): ĠSingle < Statistic Current Domain Model > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġcur Year Start Ġ= Ġstart Day . get Year Begin () ĊĠĠĠĠĠĠĠ Ġval Ġcur Year End Ġ= Ġstart Day . get Year End () ĊĠĠĠĠĠĠĠ Ġval Ġresult Year List Ġ= Ġrepository . get Results For Period ( cur Year Start . time , Ġcur Year End . time ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcur Month Start Ġ= Ġstart Day . getMonth Begin () ĊĠĠĠĠĠĠĠ Ġval Ġcur Month End Ġ= Ġstart Day . getMonth End () ĊĠĠĠĠĠĠĠ Ġval Ġresult Month List Ġ= Ġrepository . get Results For Period ( cur Month Start . time , Ġcur Month End . time ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmonth Count Ġ= Ġfilter Unique Daily Work out ( result Month List ) ĊĠĠĠĠĠĠĠ Ġval Ġyear Count Ġ= Ġfilter Unique Daily Work out ( result Year List ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġcheck Ġfor Ġst reak Ġor Ġrest Ġdays ĊĠĠĠĠĠĠĠ Ġval Ġconsecutive Days From Today Ġ= Ġget Con secutive Training Days ( result Year List , Ġstart Day . clone () Ġas ĠCalendar ) ĊĠĠĠĠĠĠĠ Ġval Ġyesterday Ġ= Ġstart Day . clone () Ġas ĠCalendar ĊĠĠĠĠĠĠĠ Ġyesterday . add ( Calendar . DAY _ OF _ MONTH , Ġ- 1 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġconsecutive Days From Y esterday Ġ= Ġget Con secutive Training Days ( result Year List , Ġyesterday . clone () Ġas ĠCalendar ) ĊĠĠĠĠĠĠĠ Ġval Ġconsecutive Days Ġ= Ġmax ( con secutive Days From Today , Ġconsecutive Days From Y esterday ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( con secutive Days Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrest Ġdays Ġare Ġalways Ġcalculated Ġfrom Ġyesterday , Ġbecause Ġit Ġis Ġstill Ġpossible Ġto Ġmake ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġa Ġwork out Ġtoday ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconsecutive Rest Days Ġ= Ġget Con secutive Rest Days ( result Year List , Ġyesterday ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatistic Model Ġ= ĠStat istic Current Domain Model ( con secutive Rest Days , Ġfalse , Ġmonth Count , Ġyear Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSingle . just ( statistic Model ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġstatistic Model Ġ= ĠStat istic Current Domain Model ( con secutive Days , Ġtrue , Ġmonth Count , Ġyear Count ) ĊĠĠĠĠĠĠĠ Ġreturn ĠSingle . just ( statistic Model ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfilter Unique Daily Work out ( result Domain List : ĠList < Work out Result Domain Model >): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġset Ġ= ĠHashSet < String >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( result Ġin Ġresult Domain List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate String Ġ= Ġresult . date . toEqual izable String () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset . add ( date String ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġset . size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Con secutive Training Days ( work out Month List : ĠList < Work out Result Domain Model >, Ġfrom Day : ĠCalendar ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġmove Ġcalendar Ġfrom Ġfrom Day Ġbackwards Ġusing Ġthe ĠDate Ġas Ġidentifier Ġ( converted Ġto Ġstring ) ĊĠĠĠĠĠĠĠ Ġ// Ġtill Ġthere Ġis Ġa Ġgap Ġbetween Ġdays ĊĠĠĠĠĠĠĠ Ġval Ġset Ġ= Ġcreate Date AsString Set ( work out Month List ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Day String Ġ= Ġfrom Day . time . toEqual izable String () ĊĠĠĠĠĠĠĠ Ġvar Ġtraining Days Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġwhile ( set . contains ( current Day String )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtraining Days ++ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Day . add ( Calendar . DAY _ OF _ MONTH , Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Day String Ġ= Ġfrom Day . time . toEqual izable String () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtraining Days ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Date AsString Set ( work out Month List : ĠList < Work out Result Domain Model >): ĠHashSet < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġset Ġ= ĠHashSet < String >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( result Ġin Ġwork out Month List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate String Ġ= Ġresult . date . toEqual izable String () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset . add ( date String ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġset ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Con secutive Rest Days ( work out Year List : ĠList < Work out Result Domain Model >, Ġfrom Day : ĠCalendar ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġmove Ġcalendar Ġfrom Ġfrom Day Ġbackwards Ġusing Ġthe ĠDate Ġas Ġidentifier Ġ( converted Ġto Ġstring ) ĊĠĠĠĠĠĠĠ Ġ// Ġtill Ġthere Ġis Ġa Ġwork out Ġentry Ġin Ġthe Ġset Ġ( or Ġ 3 6 5 Ġdays Ġare Ġpassed ) ĊĠĠĠĠĠĠĠ Ġval Ġset Ġ= Ġcreate Date AsString Set ( work out Year List ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Day String Ġ= Ġfrom Day . time . toEqual izable String () ĊĠĠĠĠĠĠĠ Ġvar Ġrest Days Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġwhile (! set . contains ( current Day String )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrest Days ++ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Day . add ( Calendar . DAY _ OF _ MONTH , Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Day String Ġ= Ġfrom Day . time . toEqual izable String () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rest Days Ġ>= Ġ 3 6 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġrest Days ĊĠĠĠ Ġ} Ċ }