package Ġcom . guardian ange ls . foot ball . ui . match . add match Ċ Ċ import Ġandroid . net . Uri Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . guardian ange ls . foot ball . data . Match Ċ import Ġcom . guardian ange ls . foot ball . data . Player Ċ import Ġcom . guardian ange ls . foot ball . network . Network State Ċ import Ġcom . guardian ange ls . foot ball . repository . Match Repository Ċ import Ġcom . guardian ange ls . foot ball . repository . Team Repository Ċ import Ġdagger . h ilt . android . lifecycle . H ilt ViewModel Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . channels . Channel Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . launch Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . time .* Ċ import Ġjavax . inject . Inject Ċ Ċ @ H ilt ViewModel Ċ class ĠAdd Up coming ViewModel Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġmatch Repository : ĠMatch Repository , ĊĠĠĠ Ġprivate Ġval Ġteam Repository : ĠTeam Repository Ċ ) Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġdate Channel Ġ= ĠChannel < LocalDate >() ĊĠĠĠ Ġprivate Ġval Ġtime Channel Ġ= ĠChannel < Local Time >() ĊĊĠĠĠ Ġprivate Ġval Ġ_ team 1 Image Uri Ġ= ĠMutable LiveData < Uri ?> () ĊĠĠĠ Ġval Ġteam 1 Image Uri : ĠLive Data < Uri ?> Ġget () Ġ= Ġ_ team 1 Image Uri ĊĊĠĠĠ Ġprivate Ġval Ġ_ team 2 Image Uri Ġ= ĠMutable LiveData < Uri >() ĊĠĠĠ Ġval Ġteam 2 Image Uri : ĠLive Data < Uri > Ġget () Ġ= Ġ_ team 2 Image Uri ĊĊĠĠĠ Ġprivate Ġval Ġ_ match Upload Result Ġ= ĠMutable LiveData < Network State < Boolean >>() ĊĠĠĠ Ġval Ġmatch Upload Result : ĠLive Data < Network State < Boolean >> Ġget () Ġ= Ġ_ match Upload Result ĊĊĠĠĠ Ġprivate Ġval Ġ_ match Update Result Ġ= ĠMutable LiveData < Network State < Match >>() ĊĠĠĠ Ġval Ġmatch Update Result : ĠLive Data < Network State < Match >> Ġget () Ġ= Ġ_ match Update Result ĊĊĠĠĠ Ġfun Ġset Date ( local Date : ĠLocalDate ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdate Channel . send ( local Date ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Time ( time 1 2 : ĠLocal Time ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Channel . send ( time 1 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġteam 1 Image ( it : ĠUri ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ team 1 Image Uri . value Ġ= Ġit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġteam 2 Image ( it : ĠUri ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ team 2 Image Uri . value Ġ= Ġit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġ_ team Ġ= ĠMutable LiveData < Network State < List < Player >> >() ĊĠĠĠ Ġval Ġteam : ĠLive Data < Network State < List < Player >>> Ġget () Ġ= Ġ_ team ĊĠĠĠ Ġfun Ġget Team List From Ids ( team Ids : ĠList < String >) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġteam Repository . get Players ( team Ids ). collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ team . value Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Match Data ( team 1 Name : ĠString , Ġteam 2 Name : ĠString , Ġtournament Name : ĠString , Ġlocation Name : ĠString , Ġteam : ĠList < Player >) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Ġ= Ġdate Channel . poll () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġtime Channel . poll () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( date Ġ!= Ġnull Ġ&& Ġtime Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠdateTime Ġ= Ġdate . at Time ( time ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġzone ID Ġ= ĠZone Id . system Default () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġepoch : ĠLong Ġ= ĠdateTime . at Zone ( zone ID ). to Epoch Second () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d ("$ team 1 Name , Ġ$ team 2 Name , Ġ$ dateTime Ġ== Ġ$ epoch , Ġ${ if Ġ( team . isEmpty ()) Ġ" Players Ġnot Ġselected " Ġelse Ġteam [ 0 ]. player Name }") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSort Ġthem Ġby Ġplayer Ġtype Ġand Ġget Ġthe Ġids . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid List : ĠList < String > Ġ= Ġteam . map Ġ{ Ġit . id !! Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatch Ġ= ĠMatch ( team 1 Name , Ġteam 2 Name , Ġdate And Time Ġ= Ġepoch , Ġteam 1 Team Ids Ġ= Ġid List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tournament Name . isNotEmpty ()) Ġmatch . tournament Name Ġ= Ġtournament Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( location Name . isNotEmpty ()) Ġmatch . location Name Ġ= Ġlocation Name ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatch Repository . add Match Data ( match , Ġteam 1 Image Uri . value , Ġteam 2 Image Uri . value !! ). collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ match Upload Result . post Value ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Match Data ( match : ĠMatch , Ġteam : ĠList < Player >) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Ġ= Ġdate Channel . poll () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġtime Channel . poll () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Date : Ġ$ date ĠTime : Ġ$ time ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġzone Id Ġ= ĠZone Id . system Default () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatch Date TI me Ġ= Ġmatch . date And Time !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠdateTime : ĠLocalDateTime ? Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate Ġ!= Ġnull Ġ&& Ġtime Ġ== Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal Time Ġ= Ġget Z onedDateTime ( match Date TI me , Ġzone Id ). to Local Time () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate . at Time ( local Time ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Ġ!= Ġnull Ġ&& Ġdate Ġ== Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal Date Ġ= Ġget Z onedDateTime ( match Date TI me , Ġzone Id ). to LocalDate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Date . at Time ( time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Ġ!= Ġnull Ġ&& Ġdate Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate . at Time ( time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠlistOf Ids Ġ= Ġarray ListOf < String >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġteam . sorted By Ġ{ Ġit . player Type Ġ}. map To ( listOf Ids ) Ġ{ Ġit . id !! Ġ} Ġ// ĠSort Ġthem Ġby Ġplayer Ġtype Ġand Ġget Ġthe Ġids . ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠIf Ġits Ġnull , Ġthe Ġprevious Ġdata Ġwill Ġnot Ġbe Ġchanged . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dateTime Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatch . date And Time Ġ= ĠdateTime . at Zone ( zone Id ). to Epoch Second () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmatch . team 1 Team Ids Ġ= ĠlistOf Ids ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d ("${ match . date And Time }") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d ("${ team 1 Image Uri . value }, Ġ${ team 2 Image Uri . value }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmatch Repository . update Match Data ( match , Ġteam 1 Image Uri . value , Ġteam 2 Image Uri . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ match Update Result . post Value ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Z onedDateTime ( match DateTime : ĠLong , Ġzone Id : ĠZone Id ): ĠZ onedDateTime Ġ= ĠInstant . of Epoch Second ( match DateTime ). at Zone ( zone Id ) Ċ }