import _ from 'lodash'
import { format } from 'util'
import Promise from 'bluebird'
import Debug from '../lib/util'
import YodelModule from '../lib/module'
import Link from './link'

let debug = new Debug('yodel:notifications')

export default class Notifications extends YodelModule {
  static MESSAGES = {
    UPDATE_TEAMSPEAK: `
[b]Eine neuere Version von TeamSpeak ist verfügbar![/b]
Du verwendest momentan Version [i]%s[/i], führe bitte so schnell wie möglich das Update auf die neueste Version [b]%s[/b] durch.
Oftmals enthalten Updates wichtige Fehlerkorrekturen und Verbesserungen, die Abstürze beheben und die Sicherheit von TeamSpeak verbessern.`,
    CREATE_ACCOUNT: `
Hey! Du hast nun schon einige Zeit auf unserem TeamSpeak verbracht, bist aber noch Gast.
Um zum User aufzusteigen benötigst du nur einen Account auf unserer Website—den zu erstellen dauert nicht lange!

[b][url=%s]Klicke hier, um dir einen Account zu erstellen.[/url][/b]`,
    REMIND_EMAIL_VERIFY: `
Hallo! Du hast dir vor Kurzem einen Account auf gamekeller.net erstellt, bist aber noch Gast. Um zum User aufzusteigen musst du deine E-Mail-Adresse bestätigen.

Wir haben dir zum Zeitpunkt der Registration eine E-Mail zugesandt. Öffne diese und folge den enthaltenen Anweisungen. Solltest du keine E-Mail erhalten haben, kannst du [url=%s]unter diesem Link[/url] eine neue beantragen.`
  }

  constructor (teamspeak, redis, config) {
    super(teamspeak, redis, config)

    this.teamspeak
      .on('connect', ::this.onConnect)
      .on('client.enter', ::this.onClientEnter)
  }

  teamspeakUpdateCheck (clid) {
    return this.teamspeak.findByClid(clid).then((info) => {
      if (!/Windows|OS X|Linux/.test(info.client_platform) || new RegExp(this.config.updates.currentVersion).test(info.client_version)) return Promise.resolve()

      return this.teamspeak.sendPrivateMessageToClid(
        clid,
        format(Notifications.MESSAGES.UPDATE_TEAMSPEAK, info.client_version.replace(/\s.*/, ''), this.config.updates.currentVersion)
      )
    })
  }

  recommendAccount (group, clid, cluid) {
    if (group !== this.teamspeak.config.defaultGroupId) return Promise.resolve()

    return this.redis.sismember('remind-of-email-verify', cluid).then(shouldRemind => {
      console.log(shouldRemind, cluid)
      return shouldRemind ? 'remind' : this.redis.hget(`data:${ cluid }`, 'activeTime')
    }).then(val => {
      if (val === 'remind') {
        return this.teamspeak.sendPrivateMessageToClid(clid, format(Notifications.MESSAGES.REMIND_EMAIL_VERIFY, this.config.account.resendEmailVerificationUrl))
      }

      if (val >= this.config.account.recommendAtMs) {
        let url = Link.createLinkUrl(cluid, this.config.account.signupEndpoint, this.config.account.linkKey)
        return this.teamspeak.sendPrivateMessageToClid(
          clid,
          format(Notifications.MESSAGES.CREATE_ACCOUNT, url)
        )
      }

      return Promise.resolve()
    })
  }

  onConnect (onlineClients) {
    _.each(onlineClients, client => this.onClientEnter(client))
  }

  onClientEnter (client) {
    this.teamspeakUpdateCheck(client.clid)
    this.recommendAccount(client.client_servergroups, client.clid, client.client_unique_identifier)
  }
}
@@ -1585,20 +1585,27 @@
 ck (clid
+, cluid
 ) %7B%0A
-
     retu
@@ -1814,24 +1814,80 @@
 .resolve()%0A%0A
+      debug.log(%60notifying $%7B cluid %7D of new version%60)%0A%0A
       return
@@ -2311,47 +2311,8 @@
 %3E %7B%0A
-      console.log(shouldRemind, cluid)%0A
     
@@ -2442,24 +2442,88 @@
 'remind') %7B%0A
+        debug.log(%60reminding $%7B cluid %7D of email verification%60)%0A
         retu
@@ -2730,24 +2730,80 @@
 mendAtMs) %7B%0A
+        debug.log(%60recommending account to $%7B cluid %7D%60)%0A
         let 
@@ -3216,24 +3216,24 @@
  (client) %7B%0A
-
     this.tea
@@ -3261,16 +3261,49 @@
 ent.clid
+, client.client_unique_identifier
 )%0A    th

Clean up log messages in notifications module