import Parser from './parser.js'
import firebase from 'firebase'

let user, groups, query;

export function liveData(fbRoot, cb){
  let go = () => {
    cb({user, groups})
    if (user && !query){
      query = fbRoot.child('groups').orderByChild(`members/${user.uid}`)
      query.on('value', s => { groups = s.val() || {}; go() })
    }
  }
  firebase.auth().onAuthStateChanged(u => { user = u; go() })
  user = firebase.auth().currentUser
  go()
}

export function actions(fbRoot, user){

  let messageFromText = (text) => {
    return {
      id: fbRoot.push().key,
      from: user.uid,
      text: text
    }
  }

  let updateThread = (thread, update) => {
    let thr = fbRoot.child(`groups/${thread.groupId}/threads/${thread.id}`)
    thr.update(update)
    let gr = fbRoot.child(`groups/${thread.groupId}`)
    gr.child(`members/${user.uid}`).set(user)
  }

  return {
    newThread(group, draftText, script = null){
      let msg = messageFromText(draftText)
      let thread = { id: msg.id, groupId: group.id }
      updateThread(thread, {
        id: thread.id,
        groupId: group.id,
        script: script && Parser.parse(script),
        roles: { organizer: { [user.uid]: true } },
        ctime: Date.now(),
        [`messages/${msg.id}`]: msg
      })
    },

    newGroup(){
      let id = fbRoot.push().key
      fbRoot.child(`groups/${id}`).set({ id, members: { [user.uid]: user } })
      return id
    },

    send(thread, draftText, activeSuggestion){
      let msg = messageFromText(draftText)
      if (activeSuggestion){
        msg.suggestionId = activeSuggestion.id
        msg.cueId = activeSuggestion.cue.id
      }
      updateThread(thread, { [`messages/${msg.id}`]: msg })
    },

    cast(thread, role, joining = true){
      updateThread(thread, { [`roles/${role}/${user.uid}`]: joining })
    }
  }

}