import React, { Component } from 'react'
import { Button, Card, Form, Input, message as Message, Popconfirm } from 'antd'
import { AntIcon, Auth, Container, ModalForm, QueryTable, QueryTableActions, QueryTreeLayout } from 'components'
import { api } from 'common/api'
import auth from 'components/authorized/handler'
import { toCamelCase } from 'util/format'
import { isEqual } from 'lodash'
import getDicData from 'util/dic'
import FormBody from './form'

const apiAction = {
    tree: api.getOrgTree,
    page: api.getOrgPage,
    add: api.sysOrgAdd,
    edit: api.sysOrgEdit,
    delete: api.sysOrgDelete
}

const name = '机构'

export default class index extends Component {

    state = {
        codes: {
            orgType: []
        }
    }

    // 表格实例
    table = React.createRef()

    // 新增窗口实例
    addForm = React.createRef()
    // 编辑窗口实例
    editForm = React.createRef()

    // 树选中节点
    selectId = undefined

    // 表格字段
    columns = [
        {
            title: '机构名称',
            width: '400px',
            dataIndex: 'name',
            sorter: true,
        },
        {
            title: '唯一编码',
            width: '200px',
            dataIndex: 'code',
            sorter: true,
        },
        {
            title: '机构类型',
            dataIndex: 'type',
            sorter: true,
            render: text => (<>{this.bindCodeValue(text, 'org_type')}</>)
        },
        {
            title: '排序',
            width: '80px',
            dataIndex: 'sort',
            sorter: true,
        },
        {
            title: '备注',
            dataIndex: 'remark',
            sorter: true,
        },
    ]

    /**
     * 构造函数,在渲染前动态添加操作字段等
     * @param {*} props 
     */
    constructor(props) {
        super(props)

        const flag = auth({ sysOrg: [['edit'], ['delete']] })

        if (flag) {
            this.columns.push({
                title: '操作',
                width: 150,
                dataIndex: 'actions',
                render: (text, record) => (<QueryTableActions>
                    <Auth auth="sysOrg:edit">
                        <a onClick={() => this.onOpen(this.editForm, record)}>编辑</a>
                    </Auth>
                    <Auth auth="sysOrg:delete">
                        <Popconfirm
                            placement="topRight"
                            title="是否确认删除"
                            onConfirm={() => this.onDelete(record)}
                        >
                            <a>删除</a>
                        </Popconfirm>
                    </Auth>
                </QueryTableActions>)
            })
        }
    }

    /**
     * 阻止外部组件引发的渲染,提升性能
     * 可自行添加渲染条件
     * [必要]
     * @param {*} props 
     * @param {*} state 
     * @returns 
     */
    shouldComponentUpdate(props, state) {
        return !isEqual(this.state, state)
    }

    /**
     * 加载字典数据,之后开始加载表格数据
     * 如果必须要加载字典数据,可直接对表格设置autoLoad=true
     */
    componentDidMount() {
        this.table.current.onLoading()
        getDicData('org_type').then(res => {
            this.setState({
                codes: res
            }, () => {
                this.table.current.onLoadData()
            })
        })
    }

    /**
     * 调用加载数据接口,可在调用前对query进行处理
     * [异步,必要]
     * @param {*} params 
     * @param {*} query 
     * @returns 
     */
    loadData = async (params, query) => {

        query = {
            ...query,
            pid: this.selectId
        }

        const { data } = await apiAction.page({
            ...params,
            ...query,
        })
        return data
    }

    /**
     * 调用树结构数据接口
     * [异步,必要]
     * @returns
     */
    loadTreeData = async () => {
        const { data } = await apiAction.tree()
        return data
    }

    /**
     * 树节点选中事件
     * [必要]
     * @param {*} id 
     */
    onSelectTree(id) {
        this.selectId = id
        this.table.current.onReloadData()
    }

    /**
     * 绑定字典数据
     * @param {*} code 
     * @param {*} name 
     * @returns 
     */
    bindCodeValue(code, name) {
        name = toCamelCase(name)
        const codes = this.state.codes[name]
        if (codes) {
            const c = codes.find((p) => p.code === code)
            if (c) {
                return c.value
            }
        }
        return null
    }

    /**
     * 打开新增/编辑弹窗
     * @param {*} modal 
     * @param {*} record 
     */
    onOpen(modal, record) {
        modal.current.open({
            orgId: this.selectId,
            record
        })
    }

    /**
     * 对表格上的操作进行统一处理
     * [异步]
     * @param {*} action 
     * @param {*} successMessage 
     */
    async onAction(action, successMessage) {
        this.table.current.onLoading()
        try {
            await action
            Message.success(successMessage)
            this.table.current.onReloadData()
        } catch {
            this.table.current.onLoaded()
        }
    }

    /**
     * 删除
     * @param {*} record 
     */
    onDelete(record) {
        this.onAction(
            apiAction.delete(record),
            '删除成功'
        )
    }

    //#region 自定义方法
    //#endregion

    render() {
        return (
            <QueryTreeLayout
                loadData={this.loadTreeData}
                defaultExpanded={true}
                onSelect={(key) => this.onSelectTree(key)}
            >
                <Container mode="fluid">
                    <Card bordered={false}>
                        <QueryTable
                            ref={this.table}
                            autoLoad={false}
                            loadData={this.loadData}
                            columns={this.columns}
                            query={
                                <Auth auth="sysOrg:page">
                                    <Form.Item label="机构名称" name="name">
                                        <Input autoComplete="off" placeholder="请输入机构名称" />
                                    </Form.Item>
                                </Auth>
                            }
                            operator={
                                <Button
                                    icon={<AntIcon type="plus" />}
                                    onClick={() => this.onOpen(this.addForm)}
                                >新增{name}</Button>
                            }
                        />
                    </Card>
                </Container>

                <ModalForm
                    title={`新增${name}`}
                    action={apiAction.add}
                    ref={this.addForm}
                    onSuccess={() => this.table.current.onReloadData()}
                >
                    <FormBody />
                </ModalForm>

                <ModalForm
                    title={`编辑${name}`}
                    action={apiAction.edit}
                    ref={this.editForm}
                    onSuccess={() => this.table.current.onReloadData()}
                >
                    <FormBody />
                </ModalForm>
            </QueryTreeLayout>
        )
    }
}
