tree = require('../states/appState')
reqwest = require('reqwest')

settingsState = tree.select('settings')

errorReset =
  tz: null
  esp: null
  reporting_frequency: null
  name: null
  username: null
  first_name: null
  last_name: null
  phone: null
  engagement_email: null
  website: null
  logo: null
  old_password: null
  new_password1: null
  new_password2: null

actions =
  changeValue: (formType, name, payload) ->
    isValidPassword = (password)  ->
      pattern = new RegExp(
        "^(?=.*[0-9]+.*)(?=.*[a-zA-Z]+.*)[0-9a-zA-Z!@#\$%\^\&*\)\(+=._-]{8,128}$"
      )
      return pattern.test(password)
    settingsState.select('values', name).set(payload)
    tree.commit()
    switch formType
      when "company"
        settingsState.select('form_status', 'company').set(true)
      when "integrations"
        settingsState.select('form_status', 'integrations').set(true)
      when "user"
        settingsState.select('form_status', 'user').set(true)
      when "password"
        tree.commit()
        oldpw = settingsState.get('values', 'old_password')
        pw1 = settingsState.get('values', 'new_password1')
        pw2 = settingsState.get('values', 'new_password2')
        verified = isValidPassword(pw1)
        settingsState
          .select('password_verified')
          .set(verified)
        matched = (pw2 == pw1) and verified
        settingsState
          .select('passwords_match')
          .set(matched)
        settingsState
          .select('form_status', 'password')
          .set(isValidPassword(oldpw) and matched)
  dropdownChangeValue: (formType, name, payload) ->
    settingsState.select('values', name).set(payload)
    switch formType
      when "company"
        settingsState.select('form_status', 'company').set(true)
      when "user"
        settingsState.select('form_status', 'user').set(true)
  logoChange: (files) ->
    isImage = (type) ->
      split = type.split('/')
      if split[0] == 'image'
        if split[1] == 'png' then return true
        else if split[1] == 'jpg' then return true
        else if split[1] == 'jpeg' then return true
        else if split[1] == 'gif' then return true
        else return false
      else
        return false
    file = files[0]
    if not isImage(file.type)
      settingsState
        .select('errors', 'logo')
        .set(
          "The file you have selected is not the correct format.
          Please try again."
        )
    else
      settingsState.select('errors', 'logo').set(null)
      settingsState.select('values', 'logo_source').set(file.preview)
      settingsState.select('form_status', 'company').set(true)
    reader = new FileReader()
    reader.onload = (e) =>
      bstr = e.target.result
      b64 = btoa(bstr)
      settingsState.select('values', 'logo').set(b64)
      settingsState.select('values', 'logo_format').set(file.type)
    reader.readAsBinaryString(file)
  handleCompanySubmit: ->
    settingsState.select('errors').set(errorReset)
    values = settingsState.select('values')
    reqwest
      url: "/settings/"
      method: 'post'
      data:
        company_form: true
        website: values.get('website')
        tzname: values.get('tzname')
        engagement_email: values.get('engagement_email')
        esp: values.get('esp')
        reporting_frequency: values.get('reporting_frequency')
        logo: values.get('logo')
        format: values.get('logo_format')
        csrfmiddlewaretoken: Django.csrf_token()
    .then (res) ->
      settingsState
        .select('success', 'company')
        .set("Company Info successfully updated!")
      settingsState.select('form_status', 'company').set(false)
  handleIntegrationsSubmit: ->
    settingsState.select('errors').set(errorReset)
    values = settingsState.select('values')
    reqwest
      url: "/settings/"
      method: 'post'
      data:
        integrations_form: "True"
        helpdesk_email: values.get('helpdesk_email')
        zendesk_subdomain: values.get('zendesk_subdomain')
        csrfmiddlewaretoken: Django.csrf_token()
    .then (res) ->
      msg = JSON.parse(res)
      if msg['zendesk_subdomain']
        window.location.replace(Django.url('zendesk_auth'))
      settingsState
        .select('success', 'integrations')
        .set("Integration info successfully updated!")
      settingsState.select('form_status', 'integrations').set(false)
  handleUserSubmit: ->
    settingsState.select('errors').set(errorReset)
    values = settingsState.select('values')
    reqwest
      url: "/settings/"
      method: 'post'
      data:
        user_form: true
        first_name: values.get('first_name')
        last_name: values.get('last_name')
        phone: values.get('phone')
        csrfmiddlewaretoken: Django.csrf_token()
    .then (res) ->
      settingsState
        .select('success', 'user')
        .set("User Info successfully updated!")
      settingsState.select('form_status', 'user').set(false)
  handlePasswordSubmit: ->
    settingsState.select('errors').set(errorReset)
    values = settingsState.select('values')
    reqwest
      url: "/settings/"
      method: 'post'
      data:
        old_password: values.get('old_password')
        new_password1: values.get('new_password1')
        new_password2: values.get('new_password2')
        csrfmiddlewaretoken: Django.csrf_token()
    .then (res) ->
      settingsState
        .select('success', 'password')
        .set("Password successfully updated!")
      values.select('old_password').set('')
      values.select('new_password1').set('')
      values.select('new_password2').set('')
      settingsState.select('password_verified').set(false)
      settingsState.select('passwords_match').set(false)
      settingsState.select('form_status', 'password').set(false)
    .fail (err) ->
      msg = JSON.parse(err.response)
      settingsState.select('errors', 'old_password').set(msg.error)
  changeTimeView: (payload) ->
    previewState = 'monthly' if payload == '0'
    previewState = 'yearly' if payload == '1'
    settingsState.select('selected_interval').set(previewState)
  togglePlans: ->
    settingsState.select('plans', 'expanded').set(
      !(settingsState.get('plans', 'expanded'))
    )
  choosePlan: (type) ->
    settingsState.select('selected_type').set(type)
    settingsState.select('enter_card').set(true)
  closePaymentPopup: ->
    settingsState.select('enter_card').set(false)
  togglePayment: (step) ->
    settingsState.select('payment_step').set(step)
  resetPayment: ->
    settingsState.select('payment_step').set(1)
    settingsState.select('card_error').set(false)
  paymentInfo: (payload, type) ->
    if type != 'expiry'
      settingsState.select('payment_info', type).set(payload)
    else
      settingsState.select('payment_info', type).set(payload)
  receipt_change: ->
    settingsState.select('receipt').set(!(settingsState.get('receipt')))
  toggleFreePrompt: ->
    settingsState.select('free_prompt').set(!(settingsState.get('free_prompt')))
  selectBillingInterval: (payload) ->
    settingsState.select('selected_interval').set(payload)
  send_add_new_signal: ->
    settingsState.select('add_new_submit').set(true)
  add_new_submit: ->
    settingsState.select('card_error').set(false)
    settingsState.select('card_token').set(false)
    settingsState.select('add_new_submit').set(false)
    settingsState.select('form_status', 'billing').set(false)
    stripeResponseHandler = (status, response) ->
      if response.error
        settingsState
          .select('card_error_type')
          .set("number")
        settingsState
          .select('card_error')
          .set('Please enter a valid credit card')
        tree.commit()
      else
        settingsState
          .select('card_token')
          .set(response.id)
        tree.commit()
    formInputs = []
    formInputs.push(document.getElementsByName("number")[0])
    formInputs.push(document.getElementsByName("expiry")[0])
    formInputs.push(document.getElementsByName("cvc")[0])
    error = false
    for input in formInputs
      valid = false
      classes = input.className.split(' ')
      for className in classes
        if className == 'valid-input'
          valid = true
      if not valid
        error = true
        settingsState
          .select('success', 'billing')
          .set(false)
        switch input.name
          when "number"
            settingsState
              .select('card_error')
              .set('Please enter a valid card number')
          when "expiry"
            settingsState
              .select('card_error')
              .set('Please enter a valid expiration date')
          when "cvc"
            settingsState
              .select('card_error')
              .set('Please enter a valid security code')
        settingsState
          .select('card_error_type')
          .set(input.name)
        break
    if not error
      exp_split = formInputs[1].value.split(' / ')
      exp_month = exp_split[0]
      exp_year = exp_split[1]
      Stripe.card.createToken(
        number: formInputs[0].value
        exp_month: exp_month
        exp_year: exp_year
        cvc: formInputs[2].value
        , stripeResponseHandler)
    settingsState.select('add_new_submit').set(false)
  custom_accept_change: ->
    custom_accept = settingsState.select('custom_accept')
    current_state = custom_accept.get()
    custom_accept.set(!current_state)
  subscribe_custom: ->
    settingsState.select('card_error').set(false)
    settingsState.select('card_token').set(false)
    settingsState.select('add_new_submit').set(false)
    settingsState.select('form_status', 'billing').set(false)
    stripeResponseHandler = (status, response) ->
      if response.error
        settingsState
          .select('card_error_type')
          .set("number")
        settingsState
          .select('card_error')
          .set('Please enter a valid credit card')
        tree.commit()
      else
        settingsState
          .select('card_token')
          .set(response.id)
        reqwest
          url: "/stripe/subscribe-custom/"
          method: 'post'
          data:
            'stripeToken': response.id
            'plan': settingsState.get('custom_plan')
            'custom_code': settingsState.get('custom_code')
            'csrfmiddlewaretoken': Django.csrf_token()
        .then (res) ->
          settingsState
            .select('card')
            .set(res)
          settingsState.select('payment_step').set(3)
        .fail (res) ->
          settingsState.select('payment_step').set(3)
          settingsState.select('payment_fail').set(true)
          settingsState.select('card_error').set(res.responseText)
    formInputs = []
    formInputs.push(document.getElementsByName("number")[0])
    formInputs.push(document.getElementsByName("expiry")[0])
    formInputs.push(document.getElementsByName("cvc")[0])
    error = false
    for input in formInputs
      valid = false
      classes = input.className.split(' ')
      for className in classes
        if className == 'valid-input'
          valid = true
      if not valid
        error = true
        settingsState
          .select('success', 'billing')
          .set(false)
        switch input.name
          when "number"
            settingsState
              .select('card_error')
              .set('Please enter a valid card number')
          when "expiry"
            settingsState
              .select('card_error')
              .set('Please enter a valid expiration date')
          when "cvc"
            settingsState
              .select('card_error')
              .set('Please enter a valid security code')
        settingsState
          .select('card_error_type')
          .set(input.name)
        break
    if not settingsState.get('custom_accept')
      error = true
      settingsState.select('custom_accept_error').set(true)
    if not error
      exp_split = formInputs[1].value.split(' / ')
      exp_month = exp_split[0]
      exp_year = exp_split[1]
      Stripe.card.createToken(
        number: formInputs[0].value
        exp_month: exp_month
        exp_year: exp_year
        cvc: formInputs[2].value
        , stripeResponseHandler)
    settingsState.select('add_new_submit').set(false)
  add_card: ->
    reqwest
      url: "/stripe/credit/change/"
      method: 'post'
      data:
        'stripeToken': settingsState.get('card_token')
        'csrfmiddlewaretoken': Django.csrf_token()
    .then (res) ->
      settingsState.select('card_token').set(false)
      settingsState
        .select('card_error')
        .set(false)
      settingsState
        .select('card')
        .set(res)
      tree.commit()
      settingsState.select('payment_step').set(3)
    .fail (res) ->
      settingsState.select('card_token').set(false)
      settingsState
        .select('success', 'billing')
        .set(false)
      switch res.responseText
        when "Your card's security code is incorrect."
          settingsState
            .select('card_error_type')
            .set("cvc")
        when "Your card has expired."
          settingsState
            .select('card_error_type')
            .set("expiry")
        else
          settingsState
            .select('card_error_type')
            .set("number")
      settingsState
        .select('card_error')
        .set(res.responseText)
      tree.commit()
  change_card: ->
    reqwest
      url: "/stripe/credit/change/"
      method: 'post'
      data:
        'selectedCard': settingsState.get('selected_card')
        'csrfmiddlewaretoken': Django.csrf_token()
    .then (res) ->
      settingsState
        .select('card_error')
        .set(false)
      settingsState
        .select('success', 'billing')
        .set('You have successfully changed your payment method!')
      settingsState.select('status', 'billing').set(false)
    .fail (res) ->
      settingsState
        .select('errors', 'billing')
        .set('There was a problem setting your default payment method.')
      settingsState
        .select('success', 'billing')
        .set(false)
  subscribe_add_card: ->
    reqwest
      url: "/stripe/credit/add/"
      method: 'post'
      data:
        'stripeToken': settingsState.get('card_token')
        'csrfmiddlewaretoken': Django.csrf_token()
    .then (res) ->
      settingsState.select('card_token').set(false)
      settingsState
        .select('card')
        .set(res)
      tree.commit()
      settingsState.select('payment_step').set(2)
    .fail (res) ->
      settingsState.select('card_token').set(false)
      switch res.responseText
        when "Your card's security code is incorrect."
          settingsState
            .select('card_error_type')
            .set("cvc")
        when "Your card has expired."
          settingsState
            .select('card_error_type')
            .set("expiry")
        else
          settingsState
            .select('card_error_type')
            .set("number")
      tree.commit()
      settingsState
        .select('card_error')
        .set(res.responseText)
  payment_submit: ->
    type = settingsState.get('selected_type')
    interval = settingsState.get('selected_interval')
    receipt = settingsState.get('receipt')
    reqwest
      url: "/stripe/subscribe/"
      method: 'post'
      data:
        'type': type
        'plan': interval
        'receipt': receipt
        'csrfmiddlewaretoken': Django.csrf_token()
    .then (res) ->
      settingsState.select('payment_step').set(3)
      settingsState.select('plans', 'current_plan').set(type)
    .fail (res) ->
      settingsState.select('payment_step').set(3)
      settingsState.select('payment_fail').set(true)
      settingsState.select('card_error').set(res.responseText)
  change_payment: ->
    settingsState.select('change_payment').set(true)
    settingsState.select('enter_card').set(true)


module.exports = actions
