/**
 * Copyright (c) 2022 - present TinyVue Authors.
 * Copyright (c) 2022 - present Huawei Cloud Computing Technologies Co., Ltd.
 *
 * Use of this source code is governed by an MIT-style license.
 *
 * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL,
 * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR
 * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS.
 *
 */

import { extend } from '@opentiny/utils'

export const getHrList =
  ({ api, props, state }) =>
  (deptCode) => {
    state.loading = true

    const params = {
      code: deptCode,
      category: props.category
    }

    return api.fetchHrapprover(params).then((data) => {
      const hraInfo = []

      data.forEach((info) => {
        const person = info.approval_Person

        if (!person) {
          return
        }

        const persons = person.split('#')

        persons.forEach((val) => {
          const newInfo = extend({}, info, { 'approval_person': val })
          hraInfo.push(newInfo)
        })
      })

      state.loading = false
      return hraInfo
    })
  }

export const selectedDept =
  ({ api, state }) =>
  (value) => {
    if (!value) {
      state.hrList = []
      state.approvalPerson = ''
      return
    }

    api
      .getHrList(value)
      .then((result) => {
        state.hrList = result

        const hasApproval = result.some((item) => item.approval_person === state.approvalPerson)

        if (!hasApproval) {
          state.approvalPerson = ''
        }
      })
      .catch(() => {
        state.hrList = []
      })
  }

export const getDisplay =
  ({ api, state }) =>
  (value) => {
    if (state.current === value) {
      return
    }

    state.current = value

    if (!value) {
      state.hrList = []
      state.lastHrList = []
      state.approvalPerson = ''

      return
    }

    api
      .getHrList(value)
      .then((result) => {
        state.hrList = result
        state.lastHrList = result

        const hasApproval = result.some((item) => item.approval_person === state.approvalPerson)

        if (!hasApproval) {
          state.approvalPerson = ''
        }
      })
      .catch(() => {
        state.hrList = []
        state.lastHrList = []
        state.approvalPerson = ''
      })
  }

export const resetPerson =
  ({ props, state }) =>
  () => {
    state.approvalPerson = props.approvalPerson
  }

export const hrChange =
  ({ emit, state }) =>
  (value) => {
    state.current = value
    emit('update:modelValue', value)
    emit('update:approvalPerson', state.approvalPerson)
  }

export const initService = ({ props, service }) => {
  const { fetchHrapprover } = service || {}

  const fetchHrapproverNoop = () =>
    Promise.reject(
      new Error('[TINY Error][Hrapprover] Prop fetchHrapprover is mandatory when the framework service is not used')
    )

  return {
    fetchHrapprover: props.fetchHrapprover || fetchHrapprover || fetchHrapproverNoop
  }
}

export const cancel =
  ({ state }) =>
  () => {
    state.approvalPerson = state.overdueData
    state.hrList = state.lastHrList
  }