import React, { useState, useEffect } from 'react'
import { Button, Input, Row, Col, Tag, message, Modal, InputNumber } from 'antd'
import styles from '../pages.less'
import { ColumnsType } from 'antd/es/table'
import MyTable from '@/components/table'
import columns from './tableColumns'
import {
    getTemplateList,
    setPublic as setPublicService,
    setNew as setNewService,
    setHot as setHotService,
    setOrderIndex as setOrderIndexService,
} from '@/service/template'
import { H5Host } from '@/config/host'

const { Search } = Input

// 处理 columns 配置,有些字段需要宣传出链接
function parseColumns(columns: ColumnsType): ColumnsType<never> {
    return columns.map((item: any) => {
        if (item.title === '查看网页') {
            return {
                ...item,
                render: (id: string, row: any) => {
                    const { uuid, status } = row
                    if (status !== '2') return '' // 不是发布状态

                    const url = `${H5Host}/p/${id}-${uuid}?channel=0`
                    return (
                        <a href={url} target="_blank">
                            线上链接
                        </a>
                    )
                },
            }
        }
        if (item.title === '缩略图') {
            return {
                ...item,
                render: (src: string) => {
                    if (!src) return ''
                    return (
                        <a href={src} target="_blank">
                            查看缩略图
                        </a>
                    )
                },
            }
        }
        if (item.title === '标签') {
            return {
                ...item,
                render: (id, record: any) => (
                    <div>
                        {record.isHot && <Tag color="red">HOT</Tag>}
                        {record.isNew && <Tag color="green">NEW</Tag>}
                    </div>
                ),
            }
        }
        return item
    }) as ColumnsType<never>
}

export default () => {
    // 修改 columns 配置
    const formatColumns = parseColumns(columns)

    const [searchInputValue, setSearchInputValue] = useState('')
    const [keyword, setKeyword] = useState('')
    const [pageIndex, setPageIndex] = useState(0)
    const [dataSource, setDataSource] = useState([])
    const [total, setTotal] = useState(0)
    const [selectedRowIds, setSelectedRowIds] = useState('')
    const [orderIndexModalVisible, setOrderIndexModalVisible] = useState(false)
    const [orderIndex, setOrderIndex] = useState(0)

    useEffect(() => {
        // 获取列表
        getTemplateList(keyword, pageIndex).then((data: any) => {
            const { count, list } = data
            setTotal(count)
            setDataSource(list)
        })
    }, [keyword, pageIndex])

    // 搜索
    function onSearch() {
        setKeyword(searchInputValue)
    }

    // 表格 - 分页
    function onPageIndexChange(pageIndex: number) {
        setPageIndex(pageIndex)
    }

    // 表格 - 选择行
    function onRowSelected(
        selectedRowKeys: React.Key[],
        // selectedRows: never[],
    ) {
        setSelectedRowIds(selectedRowKeys.join(','))
    }

    // 获取 ids
    function getSelectedIdsArr(): string[] {
        return selectedRowIds.split(',').filter(i => i)
    }

    // 是否选择了
    function isSelectedEmpty(): boolean {
        const ids = getSelectedIdsArr()
        return ids.length === 0
    }

    // 设置为公开
    function setPublic() {
        if (isSelectedEmpty()) return
        if (!confirm('是否设置为公开?')) return

        const ids = getSelectedIdsArr()
        setPublicService(ids, true).then(() => {
            message.success('设置成功')
            changeDataSource(ids, 'isPublic', true)
        })
    }

    // 禁止公开
    function setPrivate() {
        if (isSelectedEmpty()) return
        if (!confirm('是否禁止公开?')) return

        const ids = getSelectedIdsArr()
        setPublicService(ids, false).then(() => {
            message.success('已禁止公开')
            changeDataSource(ids, 'isPublic', false)
        })
    }

    // 设置 Hot
    function setHot() {
        if (isSelectedEmpty()) return
        if (!confirm('是否设置 HOT 标签?')) return

        const ids = getSelectedIdsArr()
        setHotService(ids, true).then(() => {
            message.success('设置成功')
            changeDataSource(ids, 'isHot', true)
        })
    }

    // 取消 hot
    function setNoHot() {
        if (isSelectedEmpty()) return
        if (!confirm('是否取消 HOT 标签?')) return

        const ids = getSelectedIdsArr()
        setHotService(ids, false).then(() => {
            message.success('已取消 HOT 标签')
            changeDataSource(ids, 'isHot', false)
        })
    }

    // 设置 New
    function setNew() {
        if (isSelectedEmpty()) return
        if (!confirm('是否设置 NEW 标签?')) return

        const ids = getSelectedIdsArr()
        setNewService(ids, true).then(() => {
            message.success('设置成功')
            changeDataSource(ids, 'isNew', true)
        })
    }

    // 取消 New
    function setNoNew() {
        if (isSelectedEmpty()) return
        if (!confirm('是否取消 NEW 标签?')) return

        const ids = getSelectedIdsArr()
        setNewService(ids, false).then(() => {
            message.success('已取消 NEW 标签')
            changeDataSource(ids, 'isNew', false)
        })
    }

    // 修改排序参数
    function changeOrderIndex() {
        if (isSelectedEmpty()) return
        const ids = getSelectedIdsArr()
        setOrderIndexService(ids, orderIndex).then(() => {
            message.success('修改成功')
            changeDataSource(ids, 'orderIndex', orderIndex)
            setOrderIndexModalVisible(false)
        })
    }

    // 显示 orderIndex Modal
    function showOrderIndexModal() {
        if (isSelectedEmpty()) return
        setOrderIndexModalVisible(true)
        const ids = getSelectedIdsArr()

        // 只选中一个,则默认设置为当前的 orderIndex
        if (ids.length === 1) {
            const selectedTemplates = getTemplatesByIds(ids)
            const temp: any = selectedTemplates[0]
            setOrderIndex(temp.orderIndex)
            return
        }

        // 其他情况,设置为 0
        setOrderIndex(0)
    }

    // 修改表格数据
    function changeDataSource(ids: string[], key: string, value: any) {
        const changedData: any = {}
        changedData[key] = value

        const newDataSource = dataSource.map((item: any) => {
            const curId = item.id.toString()
            if (!ids.includes(curId)) return item
            return {
                ...item,
                ...changedData,
            }
        })
        setDataSource(newDataSource as never[])
    }

    // 根据 ids 获取作品
    function getTemplatesByIds(ids: string[]) {
        return dataSource.filter((item: any) =>
            ids.includes(item.id.toString()),
        )
    }

    return (
        <div>
            <div>
                <div className={styles.tableButtonContainer}>
                    <Modal
                        title="修改排序参数"
                        visible={orderIndexModalVisible}
                        onOk={changeOrderIndex}
                        onCancel={() => {
                            setOrderIndexModalVisible(false)
                        }}
                    >
                        <div>
                            orderIndex:{' '}
                            <InputNumber
                                min={0}
                                max={10}
                                value={orderIndex}
                                onChange={value => {
                                    setOrderIndex(value as number)
                                }}
                            />
                            ( 请输入 0-10 整数)
                        </div>
                    </Modal>
                    <Row>
                        <Col span={16}>
                            <Button
                                type="primary"
                                onClick={setPublic}
                                disabled={isSelectedEmpty()}
                            >
                                设为公开展示
                            </Button>
                            <Button
                                type="primary"
                                danger
                                onClick={setPrivate}
                                disabled={isSelectedEmpty()}
                            >
                                禁止公开展示
                            </Button>
                            <Button
                                onClick={setHot}
                                disabled={isSelectedEmpty()}
                            >
                                设为 HOT
                            </Button>
                            <Button
                                danger
                                onClick={setNoHot}
                                disabled={isSelectedEmpty()}
                            >
                                取消 HOT
                            </Button>
                            <Button
                                onClick={setNew}
                                disabled={isSelectedEmpty()}
                            >
                                设为 NEW
                            </Button>
                            <Button
                                danger
                                onClick={setNoNew}
                                disabled={isSelectedEmpty()}
                            >
                                取消 NEW
                            </Button>
                            <Button
                                type="primary"
                                onClick={showOrderIndexModal}
                                disabled={isSelectedEmpty()}
                            >
                                修改排序参数
                            </Button>
                        </Col>
                        <Col span={8} style={{ textAlign: 'right' }}>
                            <Search
                                value={searchInputValue}
                                placeholder="输入 id/标题/作者用户名"
                                onSearch={onSearch}
                                onChange={e =>
                                    setSearchInputValue(e.target.value)
                                }
                                enterButton
                                style={{ width: 400 }}
                            />
                        </Col>
                    </Row>
                </div>
            </div>
            <MyTable
                dataSource={dataSource}
                columns={formatColumns}
                pageData={{ pageIndex, total }}
                onRowSelected={onRowSelected}
                onPageIndexChange={onPageIndexChange}
            />
        </div>
    )
}