import React, { useCallback, useEffect, useState } from 'react';
import style from '../../businessPlan/create/index.less'
import { useAjax } from '@/Hook/useAjax';
import { welcomeMsgJobTypeApi } from '@/pages/weComTask/API/weMaterial/weMaterial';
import { addTaskApi, getCreateDetailsApi, updateTaskApi } from '@/pages/weComTask/API/businessPlan/create';
import { getBindMpListApi } from '@/pages/weComTask/API/corpUserAssign';
import { App, Button, Card, Empty, Form, Input, Popconfirm, Select, Space, Spin, Table } from 'antd';
import SelectCorpUserGroup from '../../corpUserManage/selectCorpUserGroup';
import { useNavigate } from 'react-router-dom';
import { toJS } from 'mobx';
import { inject, observer } from 'mobx-react';
import Strategy from './components/Strategy';
import Content from './components/content';
import { SaveOutlined, RedoOutlined, SearchOutlined, PlusOutlined } from '@ant-design/icons';
import SelectCorpUser from '../../corpUserManage/selectCorpUser';
import { monmentsColumns } from './tableConfig';
import SubmitModal from '../../businessPlan/create/submitModal';
import { groupBy } from '@/utils/utils';

export const DispatchMomentsTaskCreate = React.createContext<TASK_MOMENTS_CREATE.DispatchMomentsTaskCreate | null>(null);

/**
 * 朋友圈创建
 * @param param0 
 * @returns 
 */
const MomentsCreatePage: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE.BookListProps[], bookPlatForm: TASK_CREATE.BookPlatFormProps[] } } }> = ({ weComTaskStore }) => {

    /*************************************/
    const navigate = useNavigate();
    const { bookList, bookPlatForm } = toJS(weComTaskStore.data)
    const { message, modal } = App.useApp()
    const [settings, setSettings] = useState<TASK_MOMENTS_CREATE.SettingsProps>();
    const [msgJobTypeList, setMsgJobTypeList] = useState<{ value: string, label: string }[]>([])
    const [previewData, setPreviewData] = useState<TASK_MOMENTS_CREATE.previewDataProps>([])
    const [previewDataOld, setPreviewDataOld] = useState<TASK_MOMENTS_CREATE.previewDataProps>([])
    const [mpList, setMplist] = useState<{ label: string, value: number }[]>([])
    const [previewContent, setPreviewContent] = useState<{ [x: string]: any }>({})
    const [projectId, setProjectId] = useState<number>()
    const [subVisible, setSubVisible] = useState<boolean>(false) // 选择设置名称弹窗控制

    const welcomeMsgJobType = useAjax(() => welcomeMsgJobTypeApi())//获取欢迎语类型

    const addTask = useAjax((params) => addTaskApi(params))
    const updateTask = useAjax((params) => updateTaskApi(params))
    const getCreateDetails = useAjax((params) => getCreateDetailsApi(params))
    const getBindMpList = useAjax(() => getBindMpListApi())
    /*************************************/

    useEffect(() => {
        const project = sessionStorage.getItem('MOMENTSTASKID')
        if (project) {
            const { id, isCopy } = JSON.parse(project)
            if (!isCopy) {
                setProjectId(id)
            }
            getCreateDetails.run(id).then(res => {
                sessionStorage.removeItem('MOMENTSTASKID')
                if (res?.data) {
                    const { corpUsers, bizType, platform, templateProductId, momentCreateDTO } = res.data
                    const corpUserGroups = corpUsers.map(item => {
                        return {
                            corpUsers: item.corpUserList.map(({ corpUserId, name, corpId, mpAccountId, mpAccountInfo, id }) => {
                                return { id: id || (corpId + '_' + corpUserId), corpUserId, name, corpName: item.corpName, corpId, mpAccountId, mpAccountName: mpAccountInfo?.name }
                            })
                        }
                    })

                    const newSettings: TASK_MOMENTS_CREATE.SettingsProps = {
                        bizType,
                        platform: Number(platform) as any,
                        templateProductId,
                        corpUserGroups,
                        massSendingStrategy: {
                            momentSendName: momentCreateDTO?.momentSendName || '',
                            strategyList: momentCreateDTO?.strategyList || []
                        }
                    }
                    setSettings(newSettings)

                    let id = 1;
                    const newPreviewContent: { [x: string]: any } = {};
                    corpUsers.forEach((cu) => {
                        const momentSendContent = cu?.momentSendContent;
                        (momentCreateDTO?.strategyList || []).forEach((str, s_index) => {
                            const { taskDetail } = str
                            taskDetail?.contentDTO?.forEach((_, c_index) => {
                                const content = momentSendContent?.[s_index]?.[c_index] || {}
                                newPreviewContent[id] = content
                                id++;
                            })
                        });
                    })
                    setPreviewContent(newPreviewContent)
                }
            })
        } else {
            const task = localStorage.getItem('TASK_MOMENTS_CREATE')
            if (task) {
                setSettings(JSON.parse(task).settings)
            }
        }
    }, [])

    useEffect(() => {
        welcomeMsgJobType.run().then(res => {
            if (res?.data) {
                setMsgJobTypeList(Object.keys(res.data).map(key => ({ value: key, label: res.data[key] })))
            }
        })
        getBindMpList.run().then(res => {
            setMplist(res?.data?.map((item: any) => ({ label: item.name, value: item.id })))
        })
    }, [])

    // 预览
    const preview = () => {
        const { bizType, platform, templateProductId, channel, massSendingStrategy, corpUserGroups } = settings
        if (!corpUserGroups || corpUserGroups?.length === 0) {
            message.error('请先选择客服号')
            return
        }

        if (!bizType) {
            message.error('请选择业务类型')
            return
        }
        if (!platform) {
            message.error('请选择书城')
            return
        }

        const list: any[] = []
        if (!massSendingStrategy?.strategyList?.every((str, s_index) => {
            const { taskDetail, ...sdto } = str
            if (taskDetail?.contentDTO?.length) {
                return taskDetail?.contentDTO?.every((cd, c_index, row) => {
                    if (cd?.attachmentList?.length || cd?.text?.content) {
                        const mediaItem = JSON.parse(JSON.stringify(cd?.attachmentList || []))
                        if (cd?.text?.content) {
                            mediaItem.push({
                                msgType: 'TASK_CONTENT_TEXT',
                                textContent: cd?.text?.content
                            })
                        }
                        const linkData = []
                        const miniProgramData = []
                        const contentReactNode = mediaItem.map(item => {
                            switch (item.msgType) {
                                case 'TASK_CONTENT_LINK':
                                    linkData.push(item)
                                    return `<span style="color: red">链接</span>`
                                case 'TASK_STATUS_MINIPROGRAM':
                                    miniProgramData.push(item)
                                    return `<span style="color: red">小程序</span>`
                                case 'TASK_STATUS_FILE':
                                    return `<span>文件</span>`
                                case 'TASK_STATUS_VIDEO':
                                    return `<span>视频</span>`
                                case 'TASK_CONTENT_IMAGE':
                                    return `<span>图片</span>`
                                case 'TASK_CONTENT_TEXT':
                                    return `<span>文本</span>`
                                default:
                                    return `<span style="color: red">请联系管理员</span>`
                            }
                        })
                        list.push({
                            bizType,
                            platform,
                            templateProductId,
                            channel,
                            taskName: settings?.massSendingStrategy?.momentSendName,
                            strategyData: sdto,
                            contentReactNode,
                            content: cd,
                            strategyIndex: s_index,
                            contentIndex: c_index,
                            linkData,
                            miniProgramData,
                            strategyRowSpan: c_index === 0 ? row.length : 0,
                        })
                        return true
                    } else {
                        message.error(`策略：${str?.strategyName}请填写发送内容`)
                        return false
                    }
                })
            } else {
                message.error(`策略：${str?.strategyName}请填写发送内容`)
                return false
            }
        })) {
            return
        }

        let id = 1
        const newPreviewData = corpUserGroups.reduce((pre, cur, index) => {
            return pre.concat(...list.map((item, i) => {
                return {
                    ...item,
                    id: id++,
                    corpUserGroupName: `客服组${index + 1}`,
                    corpUsers: cur.corpUsers,
                    mpAccountId: cur.corpUsers?.[0]?.mpAccountId,
                    mpAccountName: cur.corpUsers?.[0]?.mpAccountName,
                    corpUserStrList: cur.corpUsers?.map(item => item.corpId + '_' + item.corpUserId),
                    groupIndex: index,
                    groupRowSpan: i === 0 ? list.length : 0, // 用于表格合并
                }
            }))
        }, [])
        console.log(newPreviewData)

        setPreviewData(newPreviewData)
        setPreviewDataOld(newPreviewData)
    }

    const setTaskName = () => {
        if (previewDataOld.every((item, index) => {
            if ((item?.linkData?.length > 0 ? previewContent?.[index + 1]?.linkUrl : true) && (item?.miniProgramData?.length > 0 ? (previewContent?.[index + 1]?.miniprogramAppid && previewContent?.[index + 1]?.miniprogramPage) : true)) {
                return true
            } else {
                message.error('请补充图文或者小程序内容')
                return false
            }
        })) {
            setSubVisible(true)
        }
    }

    const onSubmit = (values: any) => {
        const groupData = groupBy(previewDataOld, (item) => item['groupIndex'], true);
        const { bizType, platform, templateProductId, corpUserGroups, massSendingStrategy } = settings
        const params = {
            ...values,
            bizType,
            platform,
            templateProductId,
            corpUsers: corpUserGroups?.map((item, index) => {
                const params: { [x: string]: any } = {
                    corpId: item.corpUsers[0].corpId,
                    corpUserIds: item.corpUsers.map(item => item.corpUserId)
                }
                const data = groupData[index] || []
                const momentSendContent: any[] = []
                data.forEach(d => {
                    const { strategyIndex, contentIndex, id } = d
                    if (!momentSendContent[strategyIndex]) momentSendContent[strategyIndex] = [];
                    momentSendContent[strategyIndex][contentIndex] = previewContent?.[id] || {};
                })
                params.momentSendContent = momentSendContent
                return params
            })
        }

        params.momentCreateDTO = {
            momentSendName: massSendingStrategy.momentSendName,
            strategyList: massSendingStrategy?.strategyList
        }

        if (projectId) {
            params.projectId = projectId
            updateTask.run(params).then(res => {
                if (res?.data) {
                    message.success('修改提交成功')
                    setProjectId(undefined)
                    sessionStorage.setItem('CAMPCORP', values?.projectName)
                    navigate('/weComTask/moments/taskList')
                }
            })
        } else {
            addTask.run(params).then(res => {
                if (res?.data) {
                    modal.success({
                        content: '任务提交成功',
                        styles: { body: { fontWeight: 700 } },
                        okText: '跳转任务列表',
                        closable: true,
                        onOk: () => {
                            sessionStorage.setItem('CAMPCORP', values?.projectName)
                            navigate('/weComTask/moments/taskList')
                        },
                        onCancel: () => {
                            setSubVisible(false)
                        }
                    })
                }
            })
        }
    }

    // 重置表格
    const onPreviewReset = () => {
        setPreviewData([])
        setPreviewDataOld([])
        setPreviewContent({})
    }

    const severBd = () => {
        localStorage.setItem('TASK_MOMENTS_CREATE', JSON.stringify({ settings }))
        message.success('存储成功')
    }

    const tableSearch = useCallback((values) => {
        console.log(values)
        if (values?.mpAccountIds?.length > 0 || values?.corpUserIds?.length > 0) {
            let newPreviewData: TASK_MOMENTS_CREATE.previewDataProps = []
            const corpUserStrList = values?.corpUserIds?.map(item => item.corpId + '_' + item.corpUserId)
            if (previewDataOld?.length > 0) {
                newPreviewData = previewDataOld.filter(item => (
                    (values?.mpAccountIds?.length > 0 ? values.mpAccountIds.includes(item?.mpAccountId) : true)
                    &&
                    (corpUserStrList?.length > 0 ? item.corpUserStrList.some(str => corpUserStrList.includes(str)) : true)
                )).map(item => ({ ...item, userRowSpan: 1, strategyRowSpan: 1, sendDataRowSpan: 1 }))
            }
            setPreviewData(newPreviewData)
        } else {
            setPreviewData(previewDataOld)
        }
    }, [previewDataOld, previewData])

    return <div className={style.create}>
        <Spin spinning={getCreateDetails.loading}>
            <Card title={<strong>{projectId ? getCreateDetails?.data?.data?.projectName + '任务编辑' : ''}配置区</strong>} className={`${style.card} ${style.config}`}>
                <Space wrap>
                    <Space.Compact>
                        <Button>客服组</Button>
                        <SelectCorpUserGroup
                            value={settings?.corpUserGroups}
                            onChange={(corpUserGroups) => {
                                setSettings({
                                    ...settings, corpUserGroups: corpUserGroups.map(item => {
                                        return {
                                            ...item, corpUsers: item.corpUsers.map((item: any) => {
                                                const { corpUserId, name, corpName, corpId, mpAccountId, mpAccountInfo, id } = item
                                                return { corpUserId, name, corpName, corpId, mpAccountId, mpAccountName: mpAccountInfo?.name || item?.mpAccountName, id }
                                            })
                                        }
                                    })
                                })
                                onPreviewReset()
                            }}
                        />
                    </Space.Compact>
                    <Space.Compact>
                        <Button>业务类型</Button>
                        <Select
                            showSearch
                            style={{ width: 120 }}
                            allowClear
                            placeholder="请选择类型"
                            filterOption={(input, option) =>
                                ((option?.label ?? '') as string).toLowerCase().includes(input.toLowerCase())
                            }
                            value={settings?.bizType}
                            onChange={(e) => {
                                setSettings({ ...settings, bizType: e })
                                onPreviewReset()
                            }}
                            options={msgJobTypeList.filter(item => item.value === 'novel')}
                        />
                    </Space.Compact>

                    {settings?.bizType === 'novel' ? <>
                        <Space.Compact>
                            <Button>书城</Button>
                            <Select
                                showSearch
                                allowClear
                                placeholder="请选择书城"
                                style={{ width: 120 }}
                                filterOption={(input, option) =>
                                    ((option?.label ?? '') as string).toLowerCase().includes(input.toLowerCase())
                                }
                                value={settings?.platform}
                                onChange={(e) => {
                                    setSettings({ ...settings, platform: e, templateProductId: undefined })
                                    onPreviewReset()
                                }}
                                options={bookPlatForm.map(item => ({ value: item.id, label: item.platformName }))}
                            />
                        </Space.Compact>
                        <Space.Compact>
                            <Button>适用产品</Button>
                            <Select
                                showSearch
                                style={{ width: 150 }}
                                allowClear
                                placeholder="请选择模板适用产品"
                                filterOption={(input, option) =>
                                    ((option?.label ?? '') as string).toLowerCase().includes(input.toLowerCase())
                                }
                                value={settings?.templateProductId}
                                onChange={(e) => {
                                    setSettings({ ...settings, templateProductId: e })
                                    onPreviewReset()
                                }}
                                options={bookList.filter(item => settings?.platform ? item.platformId === settings?.platform : true).map(item => ({ value: item.id, label: item.bookName }))}
                            />
                        </Space.Compact>
                    </> : settings?.bizType === 'game' ? <Space.Compact>
                        <Button>游戏渠道</Button>
                        <Input
                            style={{ width: 200 }}
                            allowClear
                            placeholder="请输入游戏渠道"
                            value={settings.channel}
                            onChange={(e) => {
                                setSettings({ ...settings, channel: e.target.value })
                                onPreviewReset()
                            }}
                        />
                    </Space.Compact> : undefined}
                </Space>

                <div className={style.settingsBody}>
                    <div className={style.settingsBody_content}>
                        <DispatchMomentsTaskCreate.Provider
                            value={{
                                settings, setSettings,
                                bookPlatForm,
                                bookList,
                                msgJobTypeList,
                                onPreviewReset
                            }}
                        >
                            {/* 朋友圈策略 */}
                            <Strategy />
                            {/* 朋友圈内容 */}
                            <Content />
                        </DispatchMomentsTaskCreate.Provider>
                    </div>
                </div>

                <Space className={style.bts} wrap>
                    <Button icon={<SaveOutlined />} onClick={severBd}>存为预设</Button>
                    <Popconfirm
                        title="确定清空?"
                        onConfirm={() => {
                            setSettings(undefined)
                            setPreviewData([])
                            setPreviewDataOld([])
                            localStorage.removeItem('TASK_MOMENTS_CREATE')
                        }}
                    >
                        <Button icon={<RedoOutlined />} danger>清空配置/预设</Button>
                    </Popconfirm>
                    <Button type='primary' onClick={preview}><SearchOutlined />预览任务/配置内容</Button>
                </Space>
            </Card>
        </Spin>

        <Card
            className={style.card}
            style={{ marginTop: 10, marginBottom: 10 }}
            extra={previewDataOld?.length > 0 ? <Button type='primary' icon={<PlusOutlined />} onClick={() => {
                setTaskName()
            }}>提交</Button> : undefined}
        >
            {previewDataOld?.length > 0 ? <div style={{ minHeight: 300 }}>
                <Form
                    layout={'inline'}
                    onFinish={tableSearch}
                    style={{ marginBottom: 10 }}
                >
                    <Form.Item label={<strong>公众号</strong>} name="mpAccountIds">
                        <Select
                            showSearch
                            style={{ minWidth: 160 }}
                            maxTagCount={1}
                            placeholder="公众号"
                            filterOption={(input, option) =>
                                ((option?.label ?? '') as string).toLowerCase().includes(input.toLowerCase())
                            }
                            allowClear
                            mode='multiple'
                            options={mpList}
                        />
                    </Form.Item>

                    <Space.Compact>
                        <Button>客服组</Button>
                        <Form.Item name="corpUserIds">
                            <SelectCorpUser placeholder="请选择客服号" />
                        </Form.Item>
                    </Space.Compact>
                    <Form.Item>
                        <Space>
                            <Button htmlType="reset">重置</Button>
                            <Button type="primary" htmlType='submit'>搜索</Button>
                        </Space>
                    </Form.Item>
                </Form>
                <Table
                    dataSource={previewData}
                    columns={monmentsColumns(bookPlatForm, bookList, bookPlatForm.find(item => item.id === Number(settings?.platform)).platformKey, previewContent, setPreviewContent)}
                    rowKey={'id'}
                    bordered={true}
                    scroll={{ y: 550 }}
                    pagination={false}
                />
            </div> : <div style={{ minHeight: 400, display: 'flex', justifyContent: 'center', alignItems: 'center' }}>
                <Empty description="请先完成模块配置后，再预览" />
            </div>}
        </Card>

        {/* 提交配置 */}
        {subVisible && <SubmitModal
            visible={subVisible}
            loading={addTask.loading || updateTask.loading}
            projectName={projectId ? getCreateDetails?.data?.data?.projectName : undefined}
            onChange={(values) => {
                onSubmit(values)
            }}
            onClose={() => {
                setSubVisible(false)
            }}
        />}
    </div>;
};

export default inject('store')(observer((props: any) => MomentsCreatePage(props.store)))