import React, { Component } from 'react'
import {
    Button,
    Card,
    Cascader,
    Form,
    Input,
    Tag,
    Popconfirm,
    message as Message,
    Radio,
    Select,
    Drawer,
} from 'antd'
import { isEqual } from 'lodash'
import { AntIcon, Auth, Container, HouseLog, QueryTable, QueryTableActions } from 'components'
import { api } from 'common/api'
import getDictData from 'util/dic'
import auth from 'components/authorized/handler'
import { toCamelCase } from 'util/format'
import { getSearchInfo } from 'util/query'

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

// 用于弹窗标题
const name = '房屋编码'

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

        options: {
            areaTree: [],
        },

        type: '',

        visibleLog: false,
    }

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

    // 表格字段
    columns = [
        {
            title: '房屋编码',
            dataIndex: 'houseCode',
            sorter: true,
            width: 400,
            render: (text, record) => (
                <>
                    {`${record.areaName}-${record.roadName}-${record.commName}-${
                        record.fullProjName
                    }-${record.no.toString().padStart(3, '0')}`}
                    <br />
                    <Tag color="purple">{text}</Tag>
                </>
            ),
        },
        {
            title: '房屋性质及行业',
            dataIndex: 'type',
            sorter: true,
            width: 150,
            render: (text, record) =>
                this.bindCodeValue(text, 'house_type') +
                (text === 2 ? `(${this.bindCodeValue(record.industry, 'house_industry')})` : ''),
        },
        {
            title: '地址',
            dataIndex: 'address',
            sorter: true,
        },
        {
            title: '登记时间',
            width: 180,
            dataIndex: 'createdTime',
            sorter: true,
        },
    ]

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

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

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

    /**
     * 阻止外部组件引发的渲染,提升性能
     * 可自行添加渲染条件
     * [必要]
     * @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(async res => {
            const { data } = await api.getAreaTree()
            this.setState(
                {
                    codes: res,
                    options: {
                        areaTree: data,
                    },
                },
                () => {
                    onLoadData()
                }
            )
        })
    }

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

        const searchInfo = getSearchInfo({
            query,
            queryType: {
                areaCode: '=',
                houseCode: 'like',
                type: '=',
                address: 'like',
            },
        })

        const { data } = await apiAction.page({
            ...params,
            searchInfo,
        })
        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 {*} modal
     * @param {*} record
     */
    onOpen(record) {
        const path = 'business/house/code/form'
        window.openContentWindow({
            key: record ? record.id : path,
            title: record ? '修改房屋编码' : '新增房屋编码',
            subTitle:
                record &&
                `${record.areaName}-${record.roadName}-${record.commName}-${record.note}-${record.no
                    .toString()
                    .padStart(3, '0')}`,
            path,
            param: {
                id: record && record.id,
            },
        })
        // modal.current.open({
        //     record
        // })
    }

    /**
     * 对表格上的操作进行统一处理
     * [异步]
     * @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()
        }
    }

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

    //#region 自定义方法
    onShowLog(id) {
        this.setState({ visibleLog: id })
    }
    //#endregion

    render() {
        const { options, codes, type, visibleLog } = this.state

        return (
            <Container mode="fluid">
                <br />
                <Card bordered={false}>
                    <QueryTable
                        ref={this.table}
                        autoLoad={false}
                        loadData={this.loadData}
                        columns={this.columns}
                        queryInitialValues={{
                            type: '',
                        }}
                        onQueryChange={values => {
                            if (values.hasOwnProperty('type')) {
                                this.setState({ type: values.type })
                            }
                        }}
                        query={
                            <Auth auth="houseCode:page">
                                <Form.Item name="areaCode">
                                    <Cascader
                                        displayRender={labels => labels.join(' - ')}
                                        fieldNames={{
                                            label: 'name',
                                            value: 'code',
                                            children: 'children',
                                        }}
                                        options={options.areaTree}
                                        className="w-400"
                                        expandTrigger="hover"
                                        placeholder="请选择所在区域"
                                    />
                                </Form.Item>
                                <Form.Item label="房屋唯一编码" name="houseCode">
                                    <Input autoComplete="off" placeholder="请输入房屋唯一编码" />
                                </Form.Item>
                                {/* <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>
                            </Auth>
                        }
                        operator={
                            <Auth auth="houseCode:add">
                                <Button
                                    icon={<AntIcon type="plus" />}
                                    onClick={() => this.onOpen()}
                                >
                                    新增{name}
                                </Button>
                            </Auth>
                        }
                    />
                </Card>
                <Drawer
                    width={600}
                    visible={visibleLog}
                    onClose={() => this.setState({ visibleLog: false })}
                    destroyOnClose
                >
                    <HouseLog id={visibleLog} />
                </Drawer>
            </Container>
        )
    }
}
