import React, { Component } from 'react'
import { Button, Card, Form, Input, InputNumber, message as Message, Radio, Select } from 'antd'
import { AntIcon, Auth, Container, QueryTable } from 'components'
import { api } from 'common/api'
import { isEqual } from 'lodash'
import getDictData from 'util/dic'
import { toCamelCase } from 'util/format'
import { getSearchInfo } from 'util/query'

/**
 * 注释段[\/**\/]为必须要改
 */

/**
 * 配置页面所需接口函数
 */
const apiAction = {
    page: api.houseSelectorPage,
}

/**
 * 统一配置权限标识
 * [必要]
 */
const authName = 'houseSelector'

export default class index extends Component {
    state = {
        codes: {
            houseType: [],
            houseIndustry: [],
        },

        saving: false,

        type: '',

        selectedRowKeys: [],
    }

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

    columns = [
        {
            title: '房屋编码',
            dataIndex: 'houseCode',
            sorter: true,
            width: 300,
            render: (text, record) =>
                `${record.areaName}-${record.roadName}-${record.commName}-${
                    record.fullProjName
                }-${record.no.toString().padStart(3, '0')}`,
        },
        {
            title: '房屋性质及行业',
            dataIndex: 'type',
            sorter: true,
            width: 150,
            render: text => this.bindCodeValue(text, 'house_type'),
        },
        {
            title: '地址',
            dataIndex: 'address',
            sorter: true,
        },
        {
            title: '登记时间',
            dataIndex: 'createdTime',
            sorter: true,
            width: 150,
        },
    ]

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

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

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

        const { data } = await apiAction.page({
            ...params,
            searchInfo,
            userId: this.props.userId,
        })
        return data
    }

    /**
     * 绑定字典数据
     * @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 {*} action
     * @param {*} successMessage
     */
    async onAction(action, successMessage) {
        const { onLoading, onLoaded, onReloadData } = this.table.current
        onLoading()
        try {
            if (action) {
                await action
            }
            if (successMessage) {
                Message.success(successMessage)
            }
            onReloadData()
        } catch {
            onLoaded()
        }
    }

    //#region 自定义方法
    async onHouseSelect() {
        const { selectedRowKeys } = this.state
        const { userId, onReloadAll } = this.props
        this.setState({ saving: true })
        await this.onAction(
            api.houseSelect({
                ids: selectedRowKeys,
                userId,
            }),
            '选房成功'
        )
        this.setState({
            saving: false,
            selectedRowKeys: [],
        })
        if (onReloadAll) {
            onReloadAll()
        }
    }
    //#endregion

    render() {
        const { codes, saving, type, selectedRowKeys } = this.state

        return (
            <Card bordered={false} className="mb-none">
                <QueryTable
                    ref={this.table}
                    autoLoad={false}
                    loadData={this.loadData}
                    columns={this.columns}
                    rowSelection={{
                        selectedRowKeys,
                        onChange: selectedRowKeys => this.setState({ selectedRowKeys }),
                    }}
                    queryInitialValues={{
                        type: '',
                    }}
                    onQueryChange={values => {
                        if (values.hasOwnProperty('type')) {
                            this.setState({ type: values.type })
                        }
                    }}
                    query={
                        <Auth auth={{ [authName]: 'selectorPage' }}>
                            <Form.Item label="编号" name="no">
                                <InputNumber
                                    formatter={value => value && value.padStart(3, '0')}
                                    max={999}
                                    min={1}
                                    precision={0}
                                    step={1}
                                    placeholder="请输入房屋序号"
                                />
                            </Form.Item>
                            <Form.Item label="房屋性质" name="type">
                                <Radio.Group buttonStyle="solid">
                                    <Radio.Button value="">全部</Radio.Button>
                                    {codes.houseType.map(item => (
                                        <Radio.Button key={item.code} value={item.code}>
                                            {item.value}
                                        </Radio.Button>
                                    ))}
                                </Radio.Group>
                            </Form.Item>
                            {type == 2 && (
                                <Form.Item label="行业" name="industry">
                                    <Select allowClear className="w-150" placeholder="请选择行业">
                                        {codes.houseIndustry.map(item => (
                                            <Select.Option key={item.code} value={item.code}>
                                                {item.value}
                                            </Select.Option>
                                        ))}
                                    </Select>
                                </Form.Item>
                            )}
                            <Form.Item label="地址" name="address">
                                <Input autoComplete="off" placeholder="请输入地址" />
                            </Form.Item>
                            <Form.Item label="房屋唯一编码" name="houseCode">
                                <Input autoComplete="off" placeholder="请输入房屋唯一编码" />
                            </Form.Item>
                        </Auth>
                    }
                    operator={
                        <Auth auth={{ [authName]: 'select' }}>
                            <Button
                                loading={saving}
                                disabled={!selectedRowKeys.length}
                                type="primary"
                                onClick={() => this.onHouseSelect()}
                            >
                                确认选择
                            </Button>
                        </Auth>
                    }
                />
            </Card>
        )
    }
}
