import {Component, EventEmitter, OnInit, Output, ViewChild} from '@angular/core';
import {AlarmService} from '../../alarm/alarm.service';
import {FindUserComponent} from '../../alarm/modal/find-user/find-user.component';
import {NzFormatEmitEvent, NzMessageService, NzTreeComponent, NzTreeNode} from 'ng-zorro-antd';
import {OverAllService} from '../../overAll/overAll.service';

@Component({
    selector: 'smart-alarm-modal',
    templateUrl: './alarm-modal.component.html',
    styles: [
            `
            .tree-div {
                border: 1px solid #dadada;
                height: 200px;
                overflow: auto;
                margin-top: 10px;
            }
        `
    ]
})
export class AlarmModalComponent implements OnInit {
    @ViewChild('smartFindUser') smartFindUser: FindUserComponent;
    @ViewChild('nzTree') nzTree: NzTreeComponent;
    @Output() done = new EventEmitter<any>();

    title;
    tabNum = 0;
    isShow = false;
    nodes;
    nodeList;
    actionid;  //告警Id

    groupList;
    sendOption = [];
    objList;

    selectTreeList = [];
    validateForm;

    selectModal = false;
    sendInfoList = [];   //发送方式
    constructor(private alarmSer: AlarmService, private message: NzMessageService,
                private overAllSer: OverAllService) {
    }

    ngOnInit() {
        this.initForm();
        this.getSendFun();
        this.getACtion();
        this.getGroup();
        this.getZabbixObj();
    }

    //初始化
    initForm() {
        this.tabNum = 0;
        this.selectTreeList = [];
        this.validateForm = {
            name: null,
            alertGroupId: null,
            warn:0,
            serious:0,
            mediaTypeIds:[],
            def_longdata:null,
            r_longdata:null,
            r_shortdata:null,
            sendInfos:null,
        };
    }

    //获取告警目标
    getACtion() {
        this.overAllSer.findGroup().subscribe(
            (res) => {
                if (res.errCode == 10000) {
                    const dataSet = res.data;
                    dataSet.forEach(res => {
                        res.title = res.name;
                        res.key = res.groupid;
                    });
                    this.nodeList = dataSet;
                    this.toNode(dataSet);
                } else {
                    this.message.info(res.errMsg);
                }
            }
        );
    }

    //获取告警分组
    getGroup(){
        this.alarmSer.alertGroupFind().subscribe(
            (res) => {
                if (res.errCode == 10000) {
                    this.groupList = res.data;
                }
            }
        );
    }

    toNode(data) {
        this.nodes = data.map(res => {
            return new NzTreeNode(res);
        });
    }

    //下级
    mouseAction(name: string, event: NzFormatEmitEvent) {
        const index = <any>event.node.key - 1;
        const data = {
            'groupids': [event.node.origin.groupid],
            'hostExtend': {
                'superiorHostid': null
            }
        };
        this.overAllSer.findDetail(data).subscribe(
            (res) => {
                if (res.data) {
                    const dataSet = res.data;
                    dataSet.forEach(res => {
                        res.title = res.name;
                        res.key = res.groupid;
                        res.isLeaf = true;
                    });
                    event.node.addChildren(dataSet);
                    this.nodeList[index].children = dataSet;
                    this.nodeList[index].expanded = true;
                } else {
                    event.node.addChildren([]);
                    this.message.info('该分组下无资源');
                }

            }
        );
        setTimeout(_ => {
        }, 1000);
    }

    //选择树节点
    selectCheckTree(event: NzFormatEmitEvent) {
        if (event.node.isChecked) {
            this.selectTreeList.push(event.node.origin.hostid);
        } else {
            const index = this.selectTreeList.indexOf(event.node.origin.hostid);
            this.selectTreeList.splice(index, 1);
        }
    }

    //获取发送方式
    getSendFun() {
        this.alarmSer.mediaTypeFind({}).subscribe(
            (res) => {
                if (res.errCode == 10000) {
                    this.sendOption = res.data;
                }
            }
        );
    }

    //获取发送对象 zabbix
    getZabbixObj() {
        this.alarmSer.zUserFind({}).subscribe(
            (res) => {
                if (res.errCode == 10000) {
                    this.objList = res.data;
                }
            }
        );
    }

    //添加发送方式
    addOption(){
        const data = {
            mediaType:null,
            receiver:""
        };
        this.sendInfoList.push(data);
    }

    //删除发送方式
    deleteOption(index){
        this.sendInfoList.splice(index,1);
    }

    //新增告警
    showAddModal(title) {
        this.title = title;
        this.isShow = true;
    }

    //编辑告警
    showEditModal(title,id) {
        this.title = title;
        this.isShow = true;
        this.actionid = id;
        this.alarmSer.getAction(id).subscribe(
            (res)=>{
                this.validateForm = res.data;
            }
        )
    }

    //取消
    handleEditCancel() {
        this.initForm();
        this.isShow = false;
    }

    //tab切换
    tabsChange(index) {
        this.tabNum = index;
    }

    //保存
    handEditleOk() {

        if(!this.check()){
            return false;
        }

        const optionArr = [];
        this.sendOption.forEach(res=>{
            if(res.checked){
                optionArr.push(res.value);
            }
        });

        this.validateForm.warn = this.validateForm.warn == true ? 1:0;
        this.validateForm.serious = this.validateForm.serious == true?1:0;
        const data = {
            name: this.validateForm.name,
            alertGroupId: this.validateForm.alertGroupId,
            warn:this.validateForm.warn,
            serious:this.validateForm.serious,
            mediaTypeIds:optionArr,
            sendInfos:this.sendInfoList,
            def_longdata:this.validateForm.def_longdata,
            r_longdata:this.validateForm.r_longdata,
            r_shortdata:this.validateForm.r_shortdata,
        };

       if(this.title == '添加告警'){
           this.create(data)
       }
       if(this.title == "编辑告警"){
           this.update(data);
       }
    }

    //校验
    check(){
        if(!this.validateForm.name){
            this.message.error("请输入告警名称");
            return false;
        }
        if(this.sendInfoList.length == 0){
            this.message.error("请选择发送对象");
            return false;
        }
        if(this.selectTreeList.length == 0 ){
            this.message.error("请选择告警目标");
            return false;
        }

        if(!this.validateForm.alertGroupId ){
            this.message.error("请选择告警分组");
            return false;
        }

        if(!this.validateForm.def_longdata ){
            this.message.error("请输入发送信息");
            return false;
        }

        let number = true;
        this.sendInfoList.map(e=>{
            if(!e.mediaType){
                number = false;
            }
            if(!e.receiver){
                number = false;
            }
        });

        if(!number){
            this.message.error("请输入发送对象");
            return false;
        }

        return true;
    }

    //创建
    create(data){
        this.alarmSer.actionCreate(data).subscribe(
            (res) => {
                if(res.errCode == 10000){
                    this.isShow = false;
                    this.initForm();
                    this.done.emit();
                    this.message.success("创建告警成功");
                }else{
                    this.message.error(res.errMsg);
                }
            }
        );
    }

    //修改
    update(data){
        data.actionid = this.actionid;
        this.alarmSer.actionUpdate(data).subscribe(
            (res) => {
                if(res.errCode == 10000){
                    this.isShow = false;
                    this.initForm();
                    this.done.emit();
                    this.message.success("编辑告警成功");
                }else{
                    this.message.error(res.errMsg);
                }
            }
        );
    }

}
