module Sync (
    SyncService(..),
) where

import Control.Monad

import Data.List

import Service
import State
import Storage
import Storage.Merge

data SyncService = SyncPacket (Stored SharedState)

instance Service SyncService where
    serviceID _ = mkServiceID "a4f538d0-4e50-4082-8e10-7e3ec2af175d"

    serviceHandler packet = do
        let SyncPacket added = fromStored packet
        ls <- svcGetLocal
        let st = storedStorage ls
            current = sort $ lsShared $ fromStored ls
            updated = filterAncestors (added : current)
        when (current /= updated) $ do
            svcSetLocal =<< wrappedStore st (fromStored ls) { lsShared = updated }

instance Storable SyncService where
    store' (SyncPacket smsg) = store' smsg
    load' = SyncPacket <$> load'