import { useModel, useRequest } from 'umi'
import { Delete, EveryUser } from '@icon-park/react'
import ProForm, { ProFormCheckbox, ProFormDependency, ProFormSwitch } from '@ant-design/pro-form'
import type { FormInstance } from 'antd'
import { message, Table, Tabs } from 'antd'
import React, { useRef, useMemo, useState, useEffect } from 'react'

import {
  fetchRoleStaffListByRoleId,
  updateRolePermission,
  getRolePermissions
} from '@/services/user/api'
import type { ColumnsType } from 'antd/lib/table'
import { formatPermission } from '@/utils/utils'
import RoleMenu from '../System/components/RoleMenu/roleMenu'
import ConnectModal from '../System/components/ConnectModal'

const Customer = () => {
  const { TabPane } = Tabs
  const formRef = useRef<FormInstance>(null)

  const columns: ColumnsType<API.RoleStaffListItem> = [
    {
      title: '用户',
      dataIndex: 'username',
      width: '15%'
    },
    {
      title: '手机',
      dataIndex: 'phone',
      width: '20%'
    },
    {
      title: '部门',
      dataIndex: 'departmentName',
      width: '20%'
    },
    {
      title: '岗位',
      dataIndex: 'position',
      width: '15%'
    },
    {
      title: '角色',
      dataIndex: 'age',
      width: '20%'
    },
    {
      title: '操作',
      dataIndex: 'opreate',
      width: '20%',
      render: () => (
        <span className="hover:text-hex-e7026e">
          <Delete fill="#fd3995" />
        </span>
      )
    }
  ]

  const { initialState } = useModel('@@initialState')
  const menuId = useMemo(() => {
    return initialState?.menuList?.find(item => item.name === '客户')?.id
  }, initialState.menuList)

  const [state, setState] = useState({
    id: '',
    roleStaff: [],
    rolePermission: {},
    activeKey: ''
  })
  const onSelect = (id: string) => {
    setState({ ...state, id })
  }

  const { run: tryGetRoleStaffList } = useRequest(
    (id: string) => fetchRoleStaffListByRoleId({ id }),
    {
      manual: true,
      onSuccess: result => {
        setState({ ...state, roleStaff: result })
      }
    }
  )

  const { run: tryGetRolePermissions } = useRequest((id: string) => getRolePermissions({ id }), {
    manual: true,
    onSuccess: (result: API.GetRolePermissionResultModel) => {
      const values = { ...formatPermission('init', result.permission) }
      setState({ ...state, rolePermission: values })
    }
  })

  useEffect(() => {
    if (state.id) {
      tryGetRoleStaffList(state.id)
      tryGetRolePermissions(state.id)
    }
    if (state.activeKey === '2') {
      formRef.current?.setFieldsValue({ ...state.rolePermission })
    }
  }, [state.id, state.activeKey])

  return (
    <div className="h-full w-full flex flex-row">
      <RoleMenu menuId={menuId} onSelect={onSelect} itemCount={state.roleStaff?.length || 0} />
      <div className="w-max-3/4">
        <div className="ml-8 bg-white p-4 shadow-md shadow-hex-3e2c5a relative">
          <div className="absolute right-4 top-4 z-100">
            {state.id && (
              <ConnectModal
                title="关联员工"
                dataId={state.id}
                onSelect={() => tryGetRoleStaffList(state.id)}
              />
            )}
          </div>
          <Tabs
            defaultActiveKey="1"
            type="card"
            onChange={key => setState({ ...state, activeKey: key })}>
            <TabPane tab="员工列表" key="1">
              <Table<API.RoleStaffListItem>
                dataSource={state.roleStaff}
                columns={columns}
                rowKey={row => row.staffId}
              />
            </TabPane>
            <TabPane tab="角色权限" key="2">
              <div className="ml-4">
                {state.id && (
                  <ProForm
                    formRef={formRef}
                    layout="horizontal"
                    onFinish={async values => {
                      const newValues = formatPermission('submit', values)
                      await updateRolePermission({
                        permission: JSON.stringify(newValues),
                        id: state.id
                      })
                      message.success('设置成功')
                    }}>
                    <ProFormSwitch
                      fieldProps={{
                        onChange(checked) {
                          if (!checked) {
                            formRef.current?.setFieldsValue({ client: [] })
                          }
                        }
                      }}
                      name="showClient"
                      label={
                        <span className="flex items-center">
                          <EveryUser className="mr-1" className="flex items-baseline mr-1" />
                          联系人
                        </span>
                      }
                    />
                    <ProFormDependency name={['showClient']}>
                      {({ showClient }) => (
                        <ProFormCheckbox.Group
                          wrapperCol={{ offset: 1 }}
                          name="client"
                          options={[
                            { value: 'access', label: '查看', disabled: !showClient },
                            { value: 'add', label: '添加联系人', disabled: !showClient },
                            { value: 'delete', label: '删除联系人', disabled: !showClient }
                          ]}
                        />
                      )}
                    </ProFormDependency>
                    <ProFormSwitch
                      fieldProps={{
                        onChange(checked) {
                          if (!checked) {
                            formRef.current?.setFieldsValue({ company: [] })
                          }
                        }
                      }}
                      name="showCompany"
                      label={
                        <span className="flex items-center">
                          <EveryUser className="mr-1" className="flex items-baseline mr-1" />
                          客户
                        </span>
                      }
                    />
                    <ProFormDependency name={['showCompany']}>
                      {({ showCompany }) => (
                        <ProFormCheckbox.Group
                          wrapperCol={{ offset: 1 }}
                          // initialValue={}
                          name="company"
                          options={[
                            { value: 'access', label: '查看', disabled: !showCompany },
                            { value: 'add', label: '添加客户', disabled: !showCompany },
                            { value: 'delete', label: '删除客户', disabled: !showCompany }
                          ]}
                        />
                      )}
                    </ProFormDependency>
                  </ProForm>
                )}
              </div>
            </TabPane>
          </Tabs>
        </div>
      </div>
    </div>
  )
}

export default Customer
