// Available variables:
  // - Machine
  // - interpret
  // - assign
  // - send
  // - sendParent
  // - spawn
  // - raise
  // - actions
  // - XState (all XState exports)
  
  const hanabiMachine = Machine({
    id: 'hanabi',
    initial: 'ready',
    context: {
      cards: [{suit: 1,  value: 3}, {suit: 2,  value: 2}, {suit: 0,  value: 1}, {suit: 0,  value: 2}, {suit: 4,  value: 1}, {suit: 0,  value: 5}, {suit: 2,  value: 2}, {suit: 4,  value: 3}, {suit: 3,  value: 2}, {suit: 0,  value: 1}, {suit: 0,  value: 4}, {suit: 2,  value: 1}, {suit: 2,  value: 4}, {suit: 4,  value: 2}, {suit: 0,  value: 3}, {suit: 2,  value: 1}, {suit: 3,  value: 1}, {suit: 0,  value: 1}, {suit: 2,  value: 5}, {suit: 1,  value: 1}, {suit: 3,  value: 5}, {suit: 1,  value: 5}, {suit: 3,  value: 2}, {suit: 0,  value: 3}, {suit: 1,  value: 2}, {suit: 4,  value: 1}, {suit: 4,  value: 5}, {suit: 0,  value: 2}, {suit: 2,  value: 3}, {suit: 4,  value: 4}, {suit: 2,  value: 3}, {suit: 0,  value: 4}, {suit: 3,  value: 4}, {suit: 4,  value: 1}, {suit: 1,  value: 4}, {suit: 3,  value: 3}, {suit: 4,  value: 3}, {suit: 3,  value: 1}, {suit: 1,  value: 3}, {suit: 1,  value: 2}, {suit: 1,  value: 1}, {suit: 4,  value: 4}, {suit: 2,  value: 1}, {suit: 3,  value: 1}, {suit: 2,  value: 4}, {suit: 4,  value: 2}, {suit: 1,  value: 1}, {suit: 3,  value: 3}, {suit: 1,  value: 4}, {suit: 3,  value: 4}],
      clues: 3,
      bombs: 0,
      discarded: [],
      played: {
        0: [],
        1: [],
        2: [],
        3: [],
        4: [],
      }
    },
    states: {
      ready: {
        on: {
          CLUE: 'clue',
          DISCARD: 'discard',
          PLAY: 'play',
        }
      },
      clue: {
        invoke: {
          src: () => {},
        }
      },
      discard: {
        invoke: {
          src: () => {},
        }
      },
      play: {
        invoke: {
          src: (ctx, evt) => {
            if (ctx.played[evt.data.suit].length === evt.data.value - 1) {
              ctx.played[evt.data.suit].push(evt.data.value)
              
              return Promise.resolve()
            } else {
              ctx.bombs += 1
              
              return Promise.resolve()
            }
          },
          onDone: 'next'
        }
      },
      next: {
        invoke: {
          src: (ctx) => {
            if (ctx.bombs !== 3 && ctx.cards.length > 0) {
              return Promise.resolve()
            }
            
            return Promise.reject()
          },
          onDone: 'ready',
          onError: 'final',
        }
      },
      final: '',
    }
  });