// License: LGPL-3.0-or-later
const h = require('snabbdom/h')
const R = require('ramda')
const flyd = require('flyd')
const geography = require('../common/geography')
const addressAutocomplete = require('./address-autocomplete-fields')

// This component is just the fields without any form wrapper or submit button, which allows you to handle those pieces outside of here.

function init(state, params$) {
//window.param$ = params$; //debug, make it global
  state = state || {}
  state = R.merge({
    selectCountry$: flyd.stream()
  , supporter: R.merge({
      email: app.user ? app.user.email : undefined
    }, R.pick(['first_name', 'last_name', 'phone', 'address', 'city', 'state_code', 'zip_code'], app.profile || {}) )
  , required: {}
  }, state)
    state.addressAutocomplete = addressAutocomplete.init({data$: flyd.stream(state.supporter)}, params$)
  state.notUSA$ = flyd.mergeAll([
    flyd.stream(!app.show_state_field)
  , flyd.map(select => !geography.isUSA(select.value), state.selectCountry$)
  ])
  return state
}

// Into state, pass:
// - to_ship (whether to show a "shipping address" message)
// - disallow_anonymous (nonprofit table has the 'no_anon' column)
// - autocomplete_supporter_address (nonprofit table has a corresponding column)
// - anonymous (Boolean)
// - first name
// - last name
// - phone
// - address
// - city
// - state_code
// - zip_code
// - profile_id
// - required: { (which fields to make required
//     - name
//     - email
//     - address (will make address + city + state_code + zip_code all required)
//   }
function view(state) {
  const emailTitle = I18n.t('nonprofits.donate.info.supporter.email') + `${state.required.email ? `${I18n.t('nonprofits.donate.info.supporter.email_required')}` : ''}`
  return h('div.u-marginY--10', [
    h('input', { props: { type: 'hidden' , name: 'profile_id' , value: state.supporter.profile_id } })
  , h('input', { props: { type: 'hidden' , name: 'nonprofit_id' , value: state.supporter.nonprofit_id || app.nonprofit_id } })
  , h('fieldset', [
      h('input.u-marginBottom--0', {
        props: {
          type: 'email'
        , title: emailTitle
        , name: 'email'
        , required: state.required.email
        , value: state.supporter.email
        , placeholder: emailTitle
        }
      })
    ])
  , h('section.group', [
      h('fieldset.u-marginBottom--0.u-floatL.col-right-4', [
        h('input', {
          props: {
            type: 'text'
          , name: 'first_name'
          , placeholder: I18n.t('nonprofits.donate.info.supporter.first_name')
          , required: state.required.first_name
          , title: I18n.t('nonprofits.donate.info.supporter.first_name')
          , value: state.supporter.first_name
          }
        })
      ])
    , h('fieldset.u-marginBottom--0.u-floatL.col-right-4', [
        h('input', {
          props: {
            type: 'text'
          , name: 'last_name'
          , placeholder: I18n.t('nonprofits.donate.info.supporter.last_name')
          , required: state.required.last_name
          , title: I18n.t('nonprofits.donate.info.supporter.last_name')
          , value: state.supporter.last_name
          }
        })
      ])
    , h('fieldset.u-marginBottom--0.u-floatL.col-right-4', [
        h('input', {
          props: {
            type: 'text'
          , name: 'phone'
          , placeholder: I18n.t('nonprofits.donate.info.supporter.phone')
          , title: I18n.t('nonprofits.donate.info.supporter.phone')
          , required: state.required.phone
          , value: state.supporter.phone
          }
        })
      ])
    ])
  , addressAutocomplete.view(state.addressAutocomplete)
  ])
}

function manualAddressFields(state) {
  state.selectCountry$ = state.selectCountry$ || flyd.stream()
  var stateOptions = R.prepend(
    h('option', {props: {value: '', disabled: true, selected: true}}, I18n.t('nonprofits.donate.info.supporter.state'))
  , R.map(
      s => h('option', {props: {selected: state.supporter.state_code === s, value: s}}, s)
    , geography.stateCodes )
  )
  var countryOptions = R.prepend(
    h('option', {props: {value: '', disabled: true, selected: true}}, I18n.t('nonprofits.donate.info.supporter.country'))
  , R.map(
      c => h('option', {props: {value: c[0]}}, c[1])
    , app.countriesList )
)
  return h('section.group.pastelBox--grey.u-padding--5', [
    state.to_ship ? h('label.u-centered.u-marginBottom--5', I18n.t('nonprofits.donate.info.supporter.shipping_address')) : ''
  , h('fieldset.col-8.u-fontSize--14', [
      h('input.u-marginBottom--0', {
        props: {
          title: 'Address'
        , placeholder: I18n.t('nonprofits.donate.info.supporter.address')
        , type: 'text'
        , name: 'address'
        , value: state.supporter.address
        }
      })
    ])
  , h('fieldset.col-right-4.u-fontSize--14', [
      h('input.u-marginBottom--0', {
        props: {
          name: 'city'
        , type: 'text'
        , placeholder: I18n.t('nonprofits.donate.info.supporter.city')
        , title: 'City'
        , value: state.supporter.city
        }
      })
    ])
  , state.notUSA$()
    ? showRegionField()
    : h('fieldset.u-marginBottom--0.u-floatL.col-4', [
        h('select.select.u-fontSize--14.u-marginBottom--0', {props: {name: 'state_code'}}, stateOptions)
      ])
  , h('fieldset.u-marginBottom--0.u-floatL.col-right-4.u-fontSize--14', [
      h('input.u-marginBottom--0', {
        props: {type: 'text', title: 'Postal code', name: 'zip_code', placeholder: I18n.t('nonprofits.donate.info.supporter.postal_code'), value: state.supporter.zip_code}
      })
    ])
  , h('fieldset.u-marginBottom--0.u-floatL.col-right-8', [
      h('select.select.u-fontSize--14.u-marginBottom--0', {
        props: { name: 'country' }
      , on: {change: ev => state.selectCountry$(ev.currentTarget)}
    }, countryOptions )
    ])
  ])
}

function showRegionField() {
  if(app.show_state_field) {
    h('input.u-marginBottom--0.u-floatL.col-4', {props: {type: 'text', title: 'Region', name: 'region', placeholder: I18n.t('nonprofits.donate.info.supporter.region'), value: state.supporter.state_code}})
  } else {
    return ""
  }
}

module.exports = {view, init}