/*
 * @Author: code4eat awesomedema@gmail.com
 * @Date: 2023-03-03 11:30:33
 * @LastEditors: code4eat awesomedema@gmail.com
 * @LastEditTime: 2023-07-28 13:35:08
 * @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';

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: 'dataTypeName',
        },
        {
            title: '数据来源',
            dataIndex: 'sourceName',
        },
        {
            title: 'SQL',
            dataIndex: 'sql',
            width: 400,
            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
        }:{
            name: formVal.name,
            evaluation: formVal.evaluation,
            dataType: formVal.dataType,
            source: formVal.source,
            sql: formVal.sql
        }

        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 UpDataActBtn = ({ record, type }: { record: any, type: 'EDIT' | 'ADD' | 'SCORE' }) => {

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

        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();
                
            }
        },[record]);

        return (
            <ModalForm
                className='SecondaryProjectDistriSet-ModalForm'
                title={`${type == 'EDIT' ? '编辑' : '新增'}${type == 'SCORE'?'级别':'二次分配项目'}`}
                width={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' && (
                        <>
                            <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: true, message: '评价下限不能为空!' }]} />
                                            <ProFormDigit name="ceiling" label="评分上限：" width={155} rules={[{ required: true, 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'
                                }}
                                options={[
                                    {
                                        label: '填报',
                                        value: 1,
                                    },
                                    {
                                        label: '自动获取',
                                        value: 2,
                                    }
                                ]}
                                rules={[{ required: true, message: '数据来源不能为空!' }]}
                            />
                            <ProFormDependency name={['source']}>
                                {
                                    ({ source }) => source == 2 && (
                                        <ProFormTextArea
                                            name="sql"
                                            label="SQL："
                                            placeholder="请输入"
                                            rules={[{ required: true, message: 'SQL不能为空!' }]}
                                        />
                                    )
                                }
                            </ProFormDependency>
                        </>
                    )
                }
            </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} rowKey='id' params={tableDataFilterParams} request={(params) => getTableData(params)} />
            </div>
        </BMSPagecontainer>
    )
}
