/*
 * @Author: code4eat awesomedema@gmail.com
 * @Date: 2023-03-03 11:30:33
 * @LastEditors: code4eat awesomedema@gmail.com
 * @LastEditTime: 2024-01-04 20:00:23
 * @FilePath: /KC-MiddlePlatform/src/pages/platform/setting/pubDicTypeMana/index.tsx
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */




import BMSPagecontainer from '@/components/BMSPageContainer';
import { BMSTable } from '@/components/BMSTable';
import { getComputeDate } from '@/pages/Home/service';
import { getDataByKeyFromDic, getPubDicData } from '@/services/getDic';
import { createFromIconfontCN } from '@ant-design/icons';

import { ActionType, ProForm, ProFormRadio } from '@ant-design/pro-components';
import { ModalForm, ProFormCascader, ProFormDependency, ProFormDigit, ProFormSelect, ProFormText, ProFormTextArea } from '@ant-design/pro-form'
import { ProColumns } from '@ant-design/pro-table';
import { Input, message, Popconfirm, InputNumber, Form } from 'antd';
import { useEffect, useRef, useState } from 'react'

import { addData, addLevelSets, delData, editData, gainData, getDefaultIndicator, getSecondaryProjectDistriData } from './service';

import './style.less';
import '../../../../utils/zhongtaiB';
import SQLEditor from '@/components/SQLEditor';

const IconFont = createFromIconfontCN({
    scriptUrl: '',
});

const AddIconFont = createFromIconfontCN({
    scriptUrl: '',
});



export default function BilingProjectMana() {

    const [tableDataFilterParams, set_tableDataFilterParams] = useState<any | undefined>();
    const [tableDataSearchKeywords, set_tableDataSearchKeywords] = useState<string>('');
    const tableRef = useRef<ActionType>();




    const columns: ProColumns[] = [

        {
            title: '项目代码',
            dataIndex: 'code',
        },
        {
            title: '项目名称',
            dataIndex: 'name',
        },
        {
            title: '评价方式',
            dataIndex: 'evaluationName',
        },
        {
            title: '评级设定',
            dataIndex: 'level',
            width: 160,
            ellipsis: true,
            renderText(text, record, index, action) {
                if (record.level && record.evaluation == 2) {
                    //评级
                    return record.level.reduce((prev: string, cur: any) => {
                        return `${prev.length > 0 ? prev + '|' : prev}${cur.levelName}`
                    }, '')
                }
                if (record.evaluation == 1) {
                    //评分
                    return (record.floor != undefined && record.ceiling != undefined) ? `${record.floor}~${record.ceiling}` : '-'
                }
                return '-'
            },
        },
        {
            title: '数据格式',
            dataIndex: 'dataTypeName',
        },
        {
            title: '数据来源',
            dataIndex: 'sourceName',
        },
        {
            title: 'SQL',
            dataIndex: 'sql',
            width: 200,
            ellipsis: true

        },
        {
            title: '说明',
            dataIndex: 'description',
            width: 200,
            ellipsis: true
        },
        {
            title: '操作',
            key: 'option',
            width: 160,
            valueType: 'option',
            render: (_: any, record: any) => {
                return record.evaluation == 2 ? [
                    <UpDataActBtn key={'SCORE'} record={record} type='SCORE' />,
                    <UpDataActBtn key={'act'} record={record} type='EDIT' />,
                    <Popconfirm
                        title="是否确认删除？"
                        key="del"
                        onConfirm={() => delTableData(record)}
                    >
                        <a>删除</a>
                    </Popconfirm>
                ] : [
                    <UpDataActBtn key={'act'} record={record} type='EDIT' />,
                    <Popconfirm
                        title="是否确认删除？"
                        key="del"
                        onConfirm={() => delTableData(record)}
                    >
                        <a>删除</a>
                    </Popconfirm>
                ]
            },
        },

    ]


    const getTableData = async (params: any) => {
        const resp = await getSecondaryProjectDistriData(params);
        if (resp) {
            return {
                data: resp.list,
                success: true,
                total: resp.totalCount,
                pageSize: resp.pageSize,
                totalPage: resp.totalPage,
            }
        }
        return []
    }

    const delTableData = async (record: any) => {
        const resp = await delData(record.id);
        if (resp) {
            message.success('操作成功！');
            tableRef.current?.reload();
            // message.success('操作成功!');
        }
    }

    const updateTable = async (formVal: any, type: 'EDIT' | "ADD" | 'SCORE') => {

        console.log({ formVal });

        const result = formVal.evaluation == 1 ? {
            name: formVal.name,
            evaluation: formVal.evaluation,
            dataType: formVal.dataType,
            source: formVal.source,
            sql: formVal.sql,
            ceiling: formVal.ceiling,
            floor: formVal.floor,
            description: formVal.description
        } : {
            name: formVal.name,
            evaluation: formVal.evaluation,
            dataType: formVal.dataType,
            source: formVal.source,
            sql: formVal.sql,
            description: formVal.description
        }

        if (type == 'ADD') {
            const resp = await addData({ ...result });
            if (resp) {
                tableRef.current?.reload();
                message.success('操作成功！');
            }
        }
        if (type == 'EDIT') {
            const resp = await editData({ id: formVal.id, ...result });
            if (resp) {
                tableRef.current?.reload();
                message.success('操作成功！');
            }
        }

        if (type == 'SCORE') {
            const needData = formVal.secondItem.map((a: any) => ({ levelName: a.levelName, levelRate: a.levelRate }))

            const resp = await addLevelSets(formVal.secondItemCode, needData);
            if (resp) {
                tableRef.current?.reload();
                message.success('操作成功！');
            }
        }

        return true;
    }

    const [dicData, set_dicData] = useState<any[]>([]);

    const getDirecData = async (key?: string) => {

        const data = await getPubDicData();
        if (data) {
            set_dicData(data);
        }
    }

    const formRef = useRef();

    const UpDataActBtn = ({ record, type }: { record: any, type: 'EDIT' | 'ADD' | 'SCORE' }) => {

        const [scoreList, set_scoreList] = useState<any[]>([]);
        const [scoreInitList, set_scoreInitList] = useState({});
        const [ifExpand,set_ifExpand] = useState(false);

        const addIndicator = () => {

            const key = Math.random();

            const temp = [...scoreList, { tempId: key, id: key, [`levelName${key}`]: '', [`levelRate${key}`]: '' }];

            set_scoreInitList({ ...scoreInitList, [`levelName${key}`]: '', [`levelRate${key}`]: '' });

            set_scoreList([...temp]);

        }

        const delGroupIndic = (data: any, index: number) => {
            let temp = [...scoreList];
            let defaultFormData: { [key: string]: any } = {};
            const result = temp.filter((a: any) => a.id != data.id);
            result.forEach((a: any) => {
                defaultFormData[`levelName${a.id}`] = a.levelName;
                defaultFormData[`levelRate${a.id}`] = a.levelRate;
            });

            set_scoreInitList({ ...defaultFormData });
            set_scoreList([...result]);
        }

        const getDefaultIndicatorHandle = async () => {
            const resp = await getDefaultIndicator(record.code);
            if (resp) {
                if (resp.length > 0) {
                    let defaultFormData: { [key: string]: any } = {};
                    const defaultVal = resp.map((a: any) => {
                        defaultFormData[`levelName${a.id}`] = a.levelName;
                        defaultFormData[`levelRate${a.id}`] = a.levelRate;
                        return { ...a, tempId: Math.random() }
                    });

                    set_scoreInitList({ ...defaultFormData });

                    set_scoreList([...defaultVal]);
                } else {
                    set_scoreList([{}]);
                }
            }
        }


        useEffect(() => {

            if (type == 'SCORE') {
                getDefaultIndicatorHandle();
      
            }
            if(record.source == 2){
                set_ifExpand(true);
            }else{
                set_ifExpand(false);
            }
        }, [record]);

        return (
            <ModalForm
                formRef={formRef}
                className='SecondaryProjectDistriSet-ModalForm'
                title={`${type == 'EDIT' ? '编辑' : '新增'}${type == 'SCORE' ? '项目评级设定' : '二次分配项目'}`}
                width={ifExpand ? 880 : 352}
                initialValues={type == 'EDIT' ? { ...record } : type == 'SCORE' ? { ...scoreInitList } : {}}
                trigger={
                    type == 'EDIT' ? <a key="edit" >编辑</a> : type != 'SCORE' ? <span className='add'>新增</span> : <a className='score'>评级设定</a>
                }
                onFinish={(val) => {
                    return updateTable(type == 'EDIT' ? { ...record, ...val, sql: val.source == 2 ? val.sql : '-' } : type == 'SCORE' ? { secondItem: scoreList, secondItemCode: record.code } : { ...val }, type);
                }}
                modalProps={{ destroyOnClose: true }}
            // colProps={{ span: 24 }}
            // grid
            >

                {
                    type == 'SCORE' && (
                        <div>
                            {
                                scoreList.map((item: any, index: number) => {

                                    return (
                                        <div className='item' key={index}>
                                            <ProFormText label='等级名称：'
                                                name={`levelName${item.id}`}
                                                fieldProps={{

                                                    //   labelInValue:true,
                                                    onChange: (e) => {

                                                        const temp = [...scoreList];
                                                        const newArr = temp.map((a: any) => {
                                                            if (a.id == item.id) {
                                                                return { ...a, levelName: e.target.value, }
                                                            }
                                                            return a
                                                        });

                                                        set_scoreList([...newArr]);
                                                    },
                                                }}
                                                width={160} />
                                            <Form.Item name={`levelRate${item.id}`} label='系数：'>
                                                <InputNumber
                                                    style={{ width: 120, height: 24, position: 'relative', top: 0 }}
                                                    onChange={(value) => {
                                                        //console.log({value,index,indicatorData});
                                                        const temp = [...scoreList];
                                                        const newArr = temp.map((a: any) => {
                                                            if (a.id == item.id) {
                                                                return { ...a, levelRate: value }
                                                            }
                                                            return a
                                                        });

                                                        set_scoreList([...newArr]);
                                                    }}
                                                />
                                            </Form.Item>
                                            <span className='delIcon' onClick={() => delGroupIndic(item, index)}><IconFont type="iconshanchu" /></span>
                                        </div>
                                    )
                                })
                            }
                            <div className='addBtn' onClick={() => addIndicator()}>
                                <AddIconFont type="icon-zengjia" style={{ color: '#3376FE' }} /><span>增加一行</span>
                            </div>
                        </div>
                    )
                }
                {
                    type != 'SCORE' && (
                        <div className='formContent' style={{ display: 'flex', flexDirection: 'row', alignItems: 'flex-start'}}>
                            <div className='left' style={{marginRight: 16,width:352 }}>
                                <ProFormText
                                    name="name"
                                    label="项目名称："
                                    placeholder="请输入"
                                    rules={[{ required: true, message: '名称不能为空!' }]}
                                />
                                <ProFormRadio.Group
                                    name="evaluation"
                                    label="评价方式："
                                    fieldProps={{
                                        buttonStyle: 'solid'
                                    }}
                                    options={[
                                        {
                                            label: '评分',
                                            value: 1,
                                        },
                                        {
                                            label: '评级',
                                            value: 2,
                                        },
                                        {
                                            label: '直接给付',
                                            value: 3,
                                        }
                                    ]}
                                    rules={[{ required: true, message: '评价方式不能为空!' }]}
                                />
                                <ProFormDependency name={['evaluation']}>
                                    {
                                        ({ evaluation }) => evaluation == 1 && (
                                            <div style={{ display: 'flex', flexDirection: 'row', justifyContent: 'space-between' }}>
                                                <ProFormDigit name="floor" label="评分下限：" width={155} rules={[{ required: false, message: '评价下限不能为空!' }]} />
                                                <ProFormDigit name="ceiling" label="评分上限：" width={155} rules={[{ required: false, message: '评价上限不能为空!' }]} />
                                            </div>
                                        )
                                    }
                                </ProFormDependency>
                                <ProFormRadio.Group
                                    name="dataType"
                                    label="数据格式："
                                    fieldProps={{
                                        buttonStyle: 'solid'
                                    }}
                                    options={[
                                        {
                                            label: '数值',
                                            value: 1,
                                        },
                                        {
                                            label: '百分比',
                                            value: 2,
                                        }
                                    ]}
                                    rules={[{ required: true, message: '数据格式不能为空!' }]}
                                />
                                <ProFormRadio.Group
                                    name="source"
                                    label="数据来源："
                                    fieldProps={{
                                        buttonStyle: 'solid',
                                        onChange(e) {
                                            if(e.target.value == 2){
                                                set_ifExpand(true);
                                            }else{
                                                set_ifExpand(false);
                                            }
                                        },
                                    }}
                                    options={[
                                        {
                                            label: '填报',
                                            value: 1,
                                        },
                                        {
                                            label: '自动获取',
                                            value: 2,
                                        },
                                        {
                                            label: '工作量',
                                            value: 3,
                                        }
                                    ]}
                                    rules={[{ required: true, message: '数据来源不能为空!' }]}
                                />
                                <ProFormTextArea
                                    name="description"
                                    label="说明："
                                    placeholder="请输入"
                                />
                            </div>
                            {

                            }

                            <ProFormDependency name={['source']}>
                                {
                                    ({ source }) => source == 2 && (
                                        <div className='right' style={{ width: 'calc(880px - 288px)' }}>
                                            <SQLEditor
                                                name="sql"
                                                label="SQL语句："
                                                rules={[{ required: true, message: 'SQL不能为空!' }]}
                                                form={formRef}
                                                height={'300px'}
                                            />
                                        </div>
                                    )
                                }
                            </ProFormDependency>


                        </div>
                    )
                }
            </ModalForm>
        )
    }

    const tableDataSearchHandle = (paramName: string) => {

        set_tableDataFilterParams({
            ...tableDataFilterParams,
            [`${paramName}`]: tableDataSearchKeywords
        })
    }


    //获取按钮点击后获取数据
    const getDataBySQL = async () => {
        const resp = await getComputeDate();
        if (resp) {
            const respStat = await gainData({ compute_date: resp });
            if (respStat) {
                tableRef.current?.reload();
            }
        }
    }


    useEffect(() => {
        getDirecData();
    }, [])

    return (
        <BMSPagecontainer className='BilingProjectMana' title={false}>
            <div className='toolBar'>
                <div className='filter'>
                    <div className='filterItem'>
                        <span className='label' style={{ whiteSpace: 'nowrap' }}> 检索：</span>
                        <Input placeholder={'请输入项目名称'} allowClear
                            suffix={
                                <IconFont style={{ color: '#99A6BF' }} type="iconsousuo" onClick={() => tableDataSearchHandle('name')} />
                            }
                            onChange={(e) => {
                                set_tableDataSearchKeywords(e.target.value);
                                if (e.target.value.length == 0) {
                                    set_tableDataFilterParams({
                                        ...tableDataFilterParams,
                                        name: ''
                                    });
                                }
                            }}
                            onPressEnter={(e) => {

                                set_tableDataFilterParams({
                                    ...tableDataFilterParams,
                                    name: (e.target as HTMLInputElement).value
                                });
                            }}

                        />
                    </div>
                </div>
                <div className='btnGroup'>
                    {/* <span className='getDataBtn' onClick={() => getDataBySQL()}>获取</span> */}
                    <UpDataActBtn record type='ADD' />
                </div>
            </div>
            <div style={{ marginTop: 16 }}>
                <BMSTable columns={columns as ProColumns[]} actionRef={tableRef} scroll={{ x: 500 }} rowKey='id' params={tableDataFilterParams} request={(params) => getTableData(params)} />
            </div>
        </BMSPagecontainer>
    )
}
