package Ġio . horizontal systems . bank wallet . modules . create wallet Ċ Ċ import Ġio . horizontal systems . bank wallet . core .* Ċ import Ġio . horizontal systems . bank wallet . entities .* Ċ import Ġio . reactivex . subjects . Behavior Subject Ċ Ċ class ĠCreate Wallet Service ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpredefined Account Type : ĠPre defined Account Type ?, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpredefined Account Type Manager : ĠI Pre defined Account Type Manager , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcoin Manager : ĠI Coin Manager , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġaccount Creator : ĠI Account Creator , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġaccount Manager : ĠI Account Manager , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġwallet Manager : ĠI Wallet Manager , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġder ivation Settings Manager : ĠID er ivation Settings Manager Ċ ) Ġ: ĠCreate Wallet Module . I Service , ĠClear able Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġstate Async Ġ= ĠBehavior Subject . create < State >() ĊĠĠĠ Ġoverride Ġval Ġcan Create Async Ġ= ĠBehavior Subject . create < Boolean >() ĊĠĠĠ Ġoverride Ġvar Ġstate : ĠState Ġ= ĠState () ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Async . onNext ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġaccounts Ġ= Ġmutable Map Of < Pre defined Account Type , ĠAccount >() ĊĠĠĠ Ġprivate Ġval Ġwallet s Ġ= Ġmutable Map Of < Coin , ĠWallet >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġsync State () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġenable ( coin : ĠCoin ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaccount Ġ= Ġresolve Account ( coin . type . pre defined Account Type ) ĊĠĠĠĠĠĠĠ Ġwallet s [ coin ] Ġ= ĠWallet ( coin , Ġaccount ) ĊĊĠĠĠĠĠĠĠ Ġsync State () ĊĠĠĠĠĠĠĠ Ġsync Can Create () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdisable ( coin : ĠCoin ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwallet s . remove ( coin ) ĊĊĠĠĠĠĠĠĠ Ġsync State () ĊĠĠĠĠĠĠĠ Ġsync Can Create () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( wallet s . isEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠCreate Error . No Wallet s ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġaccounts Ġ= Ġwallet s . values . map Ġ{ Ġit . account Ġ} ĊĠĠĠĠĠĠĠ Ġaccounts . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccount Manager . save ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( account Ġin Ġaccounts ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( pre defined Account Type Manager . pre defined Account Type ( account . type ) Ġ== ĠPre defined Account Type . Standard ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġder ivation Settings Manager . reset Standard Settings () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwallet Manager . save ( wallet s . map Ġ{ Ġit . value Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclear () Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfiltered Coins ( coins : ĠList < Coin >): ĠList < Coin > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġpredefined Account Type ?. let Ġ{ Ġtype Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoins . filter Ġ{ Ġit . type . pre defined Account Type Ġ== Ġtype Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġcoins ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġitem ( coin : ĠCoin ): ĠItem Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠItem ( coin , Ġwallet s . containsKey ( coin )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsync State () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfeatured Coins Ġ= Ġfiltered Coins ( coin Manager . featured Coins ) ĊĠĠĠĠĠĠĠ Ġval Ġcoins Ġ= Ġfiltered Coins ( coin Manager . coins ). filter Ġ{ Ġ! featured Coins . contains ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġstate Ġ= ĠState ( featured Coins . map Ġ{ Ġitem ( it ) Ġ}, Ġcoins . map Ġ{ Ġitem ( it ) Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsync Can Create () Ġ{ ĊĠĠĠĠĠĠĠ Ġcan Create Async . onNext ( wallet s . isNotEmpty ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġresolve Account ( pre defined Account Type : ĠPre defined Account Type ) Ġ: ĠAccount Ġ{ ĊĠĠĠĠĠĠĠ Ġaccounts [ pre defined Account Type ]?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġaccount Ġ= Ġaccount Creator . new Account ( pre defined Account Type ) ĊĠĠĠĠĠĠĠ Ġaccounts [ pre defined Account Type ] Ġ= Ġaccount ĊĠĠĠĠĠĠĠ Ġreturn Ġaccount ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġdata Ġclass ĠState ( var Ġfeatured : ĠList < Item >, Ġvar Ġitems : ĠList < Item >) Ġ{ ĊĠĠĠĠĠĠĠ Ġconstructor () Ġ: Ġthis ( listOf (), ĠlistOf ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠItem ( val Ġcoin : ĠCoin , Ġval Ġenabled : ĠBoolean ) ĊĊĠĠĠ Ġsealed Ġclass ĠCreate Error Ġ: ĠException () Ġ{ ĊĠĠĠĠĠĠĠ Ġobject ĠNo Wallet s Ġ: ĠCreate Error () ĊĠĠĠ Ġ} Ċ } Ċ