import {tolerant_selector} from 'selectors/base'
import {get_fields_by_user} from 'selectors/fields'
import {map_hash, array_from_hash} from 'common/utilities'
import {
  get_user_status, action_update_user, action_toggle_blacklist_user, action_open_chat,
} from 'common/users'
import {instant_job_users_fields} from 'common/constants'

const get_raw_users = (state) => state.users.users
const get_current_recipient_id = (state) => state.users.current_recipient
const get_current_user_id = (state) => state.users.current_user
const get_raw_mission_users = (state) => state.missions.users

export const get_users = tolerant_selector(
  [get_raw_users, get_fields_by_user, get_raw_mission_users],
  (users, fields_by_user, mission_users) => map_hash(users, (user) => {
    const {id} = user
    const fields = array_from_hash(fields_by_user[id]) || []
    const instant_job_users_fields_filled = instant_job_users_fields.filter(({id: field_name}) => user[field_name]).length
    const profile_rate = (fields.filter(({empty}) => !empty).length + instant_job_users_fields_filled) / (fields.length + instant_job_users_fields.length)
    let missions_count = 0
    map_hash(mission_users, (users_status) => {
      if (users_status) {
        switch (users_status[id]) {
          case 'assigned':
            missions_count += 1
            break
        }
      }
    })
    return {
      ...user,
      full_name: `${user.last_name || ""} ${user.first_name || ""}`.trim() || user.email,
      status: get_user_status(user),
      fields,
      missions_count,
      profile_rate,
      update(user) {
        action_update_user({...user, id})
      },
      toggle_blacklist() {
        action_toggle_blacklist_user(user)
      },
      open_chat() {
        action_open_chat(user)
      },
    }
  })
)

function make_user(users, id, empty) {
  return (id && users[id]) || empty
}

export const get_current_recipient = tolerant_selector(
  [get_users, get_current_recipient_id],
  (users, current_recipient_id) => make_user(users, current_recipient_id, null)
)

export const get_current_user = tolerant_selector(
  [get_users, get_current_user_id],
  (users, current_user_id) => make_user(users, current_user_id, {})
)
