import { TabService } from './../../services/tab.service';
import { debounceTime } from 'rxjs/operators';
import { Subject } from 'rxjs';
import { NzMessageService } from 'ng-zorro-antd/message';
import { Component, OnInit, HostListener, AfterViewInit, ViewChild } from "@angular/core";
import { MainService } from 'src/app/services/main.service';
import { ActivatedRoute, Router } from '@angular/router';
import { ToolService } from "../../../../services/tool.service";
import { CustomChangeDateComponent } from '../../components/custom-change-date/custom-change-date.component';
@Component({
  selector: "app-department-quality-control-statistics",
  templateUrl: "./department-quality-control-statistics.component.html",
  styleUrls: ["./department-quality-control-statistics.component.less"],
})
export class DepartmentQualityControlStatisticsComponent implements OnInit, AfterViewInit {
  @ViewChild('customChangeDate', { static: false }) customChangeDateComponent!: CustomChangeDateComponent;
  constructor(
    private mainService: MainService,
    private message: NzMessageService,
    private route: ActivatedRoute,
		private router: Router,
    private tabService: TabService,
		private tool: ToolService,
  ) {}

  listOfData: any[] = []; //表格数据
  listOfDataEnd: any[] = []; //表格合计
  pageIndex: number = 1; //表格当前页码
  pageSize: number = 30; //表格每页展示条数
  listLength: number = 0; //表格总数据量

  buildingId;//楼栋id
  hospital:any;
  deptTypeId;//科室类型id
  deptId;
  searchTimerSubject = new Subject();

  ngOnInit() {
    this.searchTimerSubject.pipe(debounceTime(500)).subscribe((v) => {
      let fun = v[0];
      fun.call(this, v[1]);
    });
  }

  ngAfterViewInit(){
    this.initSessionData();
    this.getQueryParams();
    this.getDeparts();
    setTimeout(() => {
      this.search();
    }, 0)
    this.onResize();
  }

  tableHeight:number = 0;
  @HostListener('window:resize')
  onResize(): void {
    setTimeout(() => {
      this.tableHeight = window.innerHeight - (document.querySelector('.searchDataWrap') as HTMLElement).offsetHeight - 64 - 36 - 48 - 8 - (document.querySelector('.ant-table-header') as HTMLElement).offsetHeight - 55 - this.getMoreFilter + 14;

    }, 0)
  }
	
	// 数据下钻
	viewDetail1(data, type){
		let query = null
		let item = null
		if(this.deptId){
			item = this.alldepart.find(i => i.id == this.deptId)
		}
		if(type=='all'){
			query = {
				startDate: this.customChangeDateComponent.startDate || undefined,
				endDate: this.customChangeDateComponent.endDate || undefined,
				statisticsTypeId: this.fieldConfig.fields.statisticsTypeId,
				searchQuery:{
					statusValue: 'close',
					deptDTO: item || undefined,
					deptId: this.deptId || undefined,
					taskTypeId: this.fieldConfig.fields.taskTypeId || undefined,
					taskTypeDTO: this.fieldConfig.fields.taskTypeDTO || undefined,
					groupId: this.fieldConfig.fields.groupId || undefined,
					groupDTO: this.fieldConfig.fields.groupDTO || undefined,
					userId: this.fieldConfig.fields.userId || undefined,
					userDTO: this.fieldConfig.fields.userDTO || undefined,
					buildingId: this.fieldConfig.fields.buildingId || undefined,
					buildingDTO: this.fieldConfig.fields.buildingDTO || undefined,
				}
			}
			let path = '/newStatistics/distributionInspectionStatistics/incidentList'
			let flag = this.tabService.tabs.some(v => v.path === path);
			flag && this.tabService.deleteRouteSnapshot(path);
			this.tabService.setQueryParams('dateRange', [this.customChangeDateComponent.startDate, this.customChangeDateComponent.endDate]);
			this.tabService.setQueryParams('defRange', this.customChangeDateComponent.defRange);
			sessionStorage.setItem('distributionData', JSON.stringify(query))
			this.router.navigate([path], { replaceUrl: true });
		}else{
			let arr = data.name.split('(')
			let postData: any = {
			  idx: 0,
			  sum: 20,
			  department: {
			    dept: arr[0],
			    searchType: 1,
			  },
			};
			this.mainService.getFetchDataList("simple/data", "department", postData)
			  .subscribe((res) => {
			    if (res.status == 200) {
						let item = res.list.find(i =>i.id == data.deptId)
			      query = {
			      	startDate: this.customChangeDateComponent.startDate || undefined,
			      	endDate: this.customChangeDateComponent.endDate || undefined,
			      	statisticsTypeId: this.fieldConfig.fields.statisticsTypeId,
							searchQuery:{
			      		statusValue: 'close',
			      		deptDTO: item || undefined,
			      		deptId: data.deptId || undefined,
			      		taskTypeId: this.fieldConfig.fields.taskTypeId || undefined,
			      		taskTypeDTO: this.fieldConfig.fields.taskTypeDTO,
			      		groupId: this.fieldConfig.fields.groupId || undefined,
			      		groupDTO: this.fieldConfig.fields.groupDTO || undefined,
			      		userId: this.fieldConfig.fields.userId || undefined,
			      		userDTO: this.fieldConfig.fields.userDTO || undefined,
			      		buildingId: this.fieldConfig.fields.buildingId || undefined,
			      		buildingDTO: this.fieldConfig.fields.buildingDTO || undefined
			      	}
			      }
						let path = '/newStatistics/distributionInspectionStatistics/incidentList'
						let flag = this.tabService.tabs.some(v => v.path === path);
						flag && this.tabService.deleteRouteSnapshot(path);
						this.tabService.setQueryParams('dateRange', [this.customChangeDateComponent.startDate, this.customChangeDateComponent.endDate]);
						this.tabService.setQueryParams('defRange', this.customChangeDateComponent.defRange);
						sessionStorage.setItem('distributionData', JSON.stringify(query))
						this.router.navigate([path], { replaceUrl: true });
			    }
			  });
		}
	}
	
	viewDetail2(data, type){
		let query = null
		let item = null
		if(this.deptId){
			item = this.alldepart.find(i => i.id == this.deptId)
		}
		if(type=='all'){
			query = {
				startDate: this.customChangeDateComponent.startDate || undefined,
				endDate: this.customChangeDateComponent.endDate || undefined,
				statisticsTypeId: this.fieldConfig.fields.statisticsTypeId,
				searchQuery:{
					statusValue: 'close',
					deptDTO: item || undefined,
					deptId: this.deptId || undefined,
					taskTypeId: this.fieldConfig.fields.taskTypeId || undefined,
					taskTypeDTO: this.fieldConfig.fields.taskTypeDTO,
					groupId: this.fieldConfig.fields.groupId || undefined,
					groupDTO: this.fieldConfig.fields.groupDTO || undefined,
					userId: this.fieldConfig.fields.userId || undefined,
					userDTO: this.fieldConfig.fields.userDTO || undefined,
					buildingId: this.fieldConfig.fields.buildingId || undefined,
					buildingDTO: this.fieldConfig.fields.buildingDTO || undefined,
					minuteClose: 5,
					minuteDTO: 5,
				}
			}
			let path = '/newStatistics/distributionInspectionStatistics/incidentList'
			let flag = this.tabService.tabs.some(v => v.path === path);
			flag && this.tabService.deleteRouteSnapshot(path);
			this.tabService.setQueryParams('dateRange', [this.customChangeDateComponent.startDate, this.customChangeDateComponent.endDate]);
			this.tabService.setQueryParams('defRange', this.customChangeDateComponent.defRange);
			sessionStorage.setItem('distributionData', JSON.stringify(query))
			this.router.navigate([path], { replaceUrl: true });
		}else{
			let arr = data.name.split('(')
			let postData: any = {
			  idx: 0,
			  sum: 20,
			  department: {
			    dept: arr[0],
			    searchType: 1,
			  },
			};
			this.mainService.getFetchDataList("simple/data", "department", postData)
				.subscribe((res) => {
					if (res.status == 200) {
						let item = res.list.find(i =>i.id == data.deptId)
						query = {
							startDate: this.customChangeDateComponent.startDate || undefined,
							endDate: this.customChangeDateComponent.endDate || undefined,
							statisticsTypeId: this.fieldConfig.fields.statisticsTypeId,
							searchQuery:{
								statusValue: 'close',
								deptDTO: item || undefined,
								deptId: data.deptId || undefined,
								taskTypeId: this.fieldConfig.fields.taskTypeId || undefined,
								taskTypeDTO: this.fieldConfig.fields.taskTypeDTO,
								groupId: this.fieldConfig.fields.groupId || undefined,
								groupDTO: this.fieldConfig.fields.groupDTO || undefined,
								userId: this.fieldConfig.fields.userId || undefined,
								userDTO: this.fieldConfig.fields.userDTO || undefined,
								buildingId: this.fieldConfig.fields.buildingId || undefined,
								buildingDTO: this.fieldConfig.fields.buildingDTO || undefined,
								minuteClose: 5,
								minuteDTO: 5
							}
						}
						let path = '/newStatistics/distributionInspectionStatistics/incidentList'
						let flag = this.tabService.tabs.some(v => v.path === path);
						flag && this.tabService.deleteRouteSnapshot(path);
						this.tabService.setQueryParams('dateRange', [this.customChangeDateComponent.startDate, this.customChangeDateComponent.endDate]);
						this.tabService.setQueryParams('defRange', this.customChangeDateComponent.defRange);
						sessionStorage.setItem('distributionData', JSON.stringify(query))
						this.router.navigate([path], { replaceUrl: true });
					}
				});
		}
	}
	
	viewDetail3(data, type){
		let query = null
		let item = null
		if(this.deptId){
			item = this.alldepart.find(i => i.id == this.deptId)
		}
		if(type=='all'){
			query = {
				startDate: this.customChangeDateComponent.startDate || undefined,
				endDate: this.customChangeDateComponent.endDate || undefined,
				statisticsTypeId: this.fieldConfig.fields.statisticsTypeId,
				searchQuery:{
					statusValue: 'close',
					deptDTO: item || undefined,
					deptId: this.deptId || undefined,
					taskTypeId: this.fieldConfig.fields.taskTypeId || undefined,
					taskTypeDTO: this.fieldConfig.fields.taskTypeDTO || undefined,
					groupId: this.fieldConfig.fields.groupId || undefined,
					groupDTO: this.fieldConfig.fields.groupDTO || undefined,
					userId: this.fieldConfig.fields.userId || undefined,
					userDTO: this.fieldConfig.fields.userDTO || undefined,
					buildingId: this.fieldConfig.fields.buildingId || undefined,
					buildingDTO: this.fieldConfig.fields.buildingDTO || undefined,
					specialId: 1,
					specialDTO: {
						"name": "是",
						"id": 1
					},
				}
			}
			let path = '/newStatistics/distributionInspectionStatistics/incidentList'
			let flag = this.tabService.tabs.some(v => v.path === path);
			flag && this.tabService.deleteRouteSnapshot(path);
			this.tabService.setQueryParams('dateRange', [this.customChangeDateComponent.startDate, this.customChangeDateComponent.endDate]);
			this.tabService.setQueryParams('defRange', this.customChangeDateComponent.defRange);
			sessionStorage.setItem('distributionData', JSON.stringify(query))
			this.router.navigate([path], { replaceUrl: true });
		}else{
			let arr = data.name.split('(')
			let postData: any = {
			  idx: 0,
			  sum: 20,
			  department: {
			    dept: arr[0],
			    searchType: 1,
			  },
			};
			this.mainService.getFetchDataList("simple/data", "department", postData)
				.subscribe((res) => {
					if (res.status == 200) {
						let item = res.list.find(i =>i.id == data.deptId)
						query = {
							startDate: this.customChangeDateComponent.startDate || undefined,
							endDate: this.customChangeDateComponent.endDate || undefined,
							statisticsTypeId: this.fieldConfig.fields.statisticsTypeId,
							searchQuery:{
								statusValue: 'close',
								deptDTO: item || undefined,
								deptId: data.deptId || undefined,
								taskTypeId: this.fieldConfig.fields.taskTypeId || undefined,
								taskTypeDTO: this.fieldConfig.fields.taskTypeDTO,
								groupId: this.fieldConfig.fields.groupId || undefined,
								groupDTO: this.fieldConfig.fields.groupDTO || undefined,
								userId: this.fieldConfig.fields.userId || undefined,
								userDTO: this.fieldConfig.fields.userDTO || undefined,
								buildingId: this.fieldConfig.fields.buildingId || undefined,
								buildingDTO: this.fieldConfig.fields.buildingDTO || undefined,
								specialId: 1,
								specialDTO: {
									"name": "是",
									"id": 1
								}
							}
						}
						let path = '/newStatistics/distributionInspectionStatistics/incidentList'
						let flag = this.tabService.tabs.some(v => v.path === path);
						flag && this.tabService.deleteRouteSnapshot(path);
						this.tabService.setQueryParams('dateRange', [this.customChangeDateComponent.startDate, this.customChangeDateComponent.endDate]);
						this.tabService.setQueryParams('defRange', this.customChangeDateComponent.defRange);
						sessionStorage.setItem('distributionData', JSON.stringify(query))
						this.router.navigate([path], { replaceUrl: true });
					}
				});
		}
	}
	
  getQueryParams(){
    let queryParams = this.tabService.getQueryParams();
    this.tabService.clearQueryParams();
    if(queryParams.dateRange){
      this.dateRange = queryParams.dateRange;
      this.customChangeDateComponent.initByDate(this.dateRange);
    }
  }

  get getMoreFilter(){
    let flag = this.fieldConfig.fields.groupDTO || this.fieldConfig.fields.userDTO || this.fieldConfig.fields.taskTypeDTO || this.fieldConfig.fields.statisticsTypeDTO;
    return flag ? 37 : 0;
  }

  // 初始化缓存数据
  queryType:any;
  hosId:any;
  dutyId:any;
  parentDutyId:any;
  parent:any;
  initSessionData(){
    let newStatistics = JSON.parse(sessionStorage.getItem('newStatistics'));
    let queryType:any = newStatistics.queryType;
    let hosId:any = newStatistics.hospitalId;
    let dutyId:any = newStatistics.dutyId;
  	this.parent = newStatistics.parent;

    queryType = queryType ? +queryType : undefined;
    hosId = hosId ? +hosId : undefined;
    dutyId = dutyId ? +dutyId : undefined;

    this.queryType = queryType;
    if(queryType == 1){
      this.hosId = undefined;
      this.dutyId = undefined;
      this.parentDutyId = undefined;
    }else if(queryType == 2){
      this.hosId = hosId;
      this.dutyId = undefined;
      this.parentDutyId = undefined;
    }else if(queryType == 3){
      this.hosId = undefined;
      this.dutyId = dutyId;
      this.parentDutyId = undefined;
    }else if(queryType == 4){
      this.hosId = undefined;
      this.dutyId = undefined;
      this.parentDutyId = dutyId;
    }
  }

  get getHosId(){
    return this.parentDutyId || this.dutyId || this.hosId;
  }

  // 表格数据
  loading1 = false;
  getList(num?: number, field?: string, sort?: string) {
    if (num !== undefined) {
      this.pageIndex = num;
    }
    let postData:any = {
      idx: this.pageIndex - 1,
      sum: this.pageSize,
			showParentDept: this.parent==1 ? 'true' : undefined,
			deptId: this.deptId || undefined,
			buildingId: this.fieldConfig.fields.buildingId || undefined,
      startDate: this.customChangeDateComponent.startDate || undefined,
      endDate: this.customChangeDateComponent.endDate || undefined,
      hosId: this.getHosId,
      groupId: this.fieldConfig.fields.userId ? undefined : (this.fieldConfig.fields.groupId || undefined),
      userId: this.fieldConfig.fields.userId || undefined,
      statisticsTypeId: this.fieldConfig.fields.statisticsTypeId || undefined,
      taskTypeId: this.fieldConfig.fields.taskTypeId || undefined,
    };
    if (field && sort) {
      postData.sort = `${field} ${sort === "ascend" ? `asc` : `desc`}`
    }
    this.loading1 = true;
    this.mainService
      .postCustom("itsm/report", "deptTransOrderQc", postData)
      .subscribe((result) => {
        this.loading1 = false;
        this.listOfData = result.dataList.filter((v, i) => { return i != result.dataList.length - 1 });
        this.listOfDataEnd = result.dataList.filter((v, i) => { return i == result.dataList.length - 1 });
        this.listLength = result.totalCount;
      });
  }

  // 列表排序
  sortCurrent:any = {totalCount: 'descend'};
  sortCurrentKey: string = "totalCount";
  sortCurrentValue: string | null = "descend";
  sort(e) {
    const { key, value } = e;
    this.sortCurrentKey = key;
    this.sortCurrentValue = value;
    this.getList(this.pageIndex, this.sortCurrentKey, this.sortCurrentValue);
  }

  // 搜索
  search() {
    this.getList(1, this.sortCurrentKey, this.sortCurrentValue);
  }

  // 日期选择
  dateRange: any = [];

  // 导出
  excelExportLoading:any = false;
  excelExport(){
    this.excelExportLoading = this.message.loading("导出中..", {
      nzDuration: 0,
    }).messageId;
    let postData:any = {
			showParentDept: this.parent==1 ? 'true' : undefined,
			deptId: this.deptId || undefined,
			buildingId: this.fieldConfig.fields.buildingId || undefined,
      startDate: this.customChangeDateComponent.startDate || undefined,
      endDate: this.customChangeDateComponent.endDate || undefined,
      hosId: this.getHosId,
      groupId: this.fieldConfig.fields.userId ? undefined : (this.fieldConfig.fields.groupId || undefined),
      userId: this.fieldConfig.fields.userId || undefined,
      statisticsTypeId: this.fieldConfig.fields.statisticsTypeId || undefined,
      taskTypeId: this.fieldConfig.fields.taskTypeId || undefined,
    };
    if (this.sortCurrentKey && this.sortCurrentValue) {
      postData.sort = `${this.sortCurrentKey} ${this.sortCurrentValue === "ascend" ? `asc` : `desc`}`
    }
    this.mainService
      .postExportCustom("itsm/exportMergeTitle", "deptTransOrderQc", postData)
      .subscribe((data) => {
        this.message.remove(this.excelExportLoading);
        this.excelExportLoading = false;
        this.message.success('导出成功');
        var file = new Blob([data], {
          type: "application/vnd.ms-excel",
        });
        //trick to download store a file having its URL
        var fileURL = URL.createObjectURL(file);
        var a = document.createElement("a");
        a.href = fileURL;
        a.target = "_blank";
        a.download = `${this.route.parent.routeConfig.data.title}.xls`;
        document.body.appendChild(a);
        a.click();
      },(err) => {
        this.message.remove(this.excelExportLoading);
        this.excelExportLoading = false;
        this.message.error('导出失败');
      });
  }
  // 重置
  reset(){
    this.sortCurrentKey = "totalCount";
		this.sortCurrentValue = "descend";
		this.sortCurrent = {totalCount: 'descend'};
    this.dateRange = []
    this.deptId = undefined;
    this.fieldConfig.fields = {groupId: undefined, userId: undefined, statisticsTypeId: undefined, taskTypeId: undefined, buildingId: undefined};
    this.customChangeDateComponent.resetByDate();
    setTimeout(_=>{
    	this.search();
    })
  }

  // 楼栋搜索
  changeBuildingInp(e) {
    this.searchTimer(this.getBuildingList, e);
  }

  // 防抖
  isLoading = false;
  searchTimer(fun, e) {
    this.isLoading = true;
    this.searchTimerSubject.next([fun, e]);
  }

  openChangeBuilding(flag){
    flag && this.getBuildingList();
  }

	// 科室搜索
	changeInp(e) {
	  this.searchTimer(this.getDeparts, e);
	}

	// 获取所有科室
	alldepart:any;
	getDeparts(dept?) {
	  let data = {
	    department: {
	      statisticalHosId: this.getHosId,
	      dept: dept,
	      searchType: 1,
	    },
	    idx: 0,
	    sum: 20,
	  };
	  this.mainService
	    .getFetchDataList("data", "department", data)
	    .subscribe((data) => {
				this.isLoading = false;
	      this.alldepart = data.list;
	    });
	}

  // 获取报修科室列表
  buildingList:any[] = [];
  getBuildingList(keyword?) {
    let data = {
      building: {
        simpleQuery: true,
        buildingName: keyword,
        statisticalHosId:this.getHosId,
      },
      idx: 0,
      sum: 20,
    };
    this.isLoading = true;
    this.mainService
      .getFetchDataList("data", "building", data)
      .subscribe((data) => {
        this.isLoading = false;
        this.buildingList = data.list;
      });
  }

  // 详细搜索
  fieldConfig:any = {
    fields: {groupId: undefined, userId: undefined, statisticsTypeId: undefined, taskTypeId: undefined, buildingId: undefined},
    config: {groupAndUser: true, statisticsType: true, taskType: true, building: true},
  }
  showSearchMore:boolean = false;
  showMore(){
    this.showSearchMore = true;
  }

  cancelEvent(){
    this.showSearchMore = false;
  }

  submitEvent(fields){
    this.showSearchMore = false;
    this.fieldConfig.fields = fields;
    console.log('this.fieldConfig.fields:', this.fieldConfig.fields)
    this.search();
    this.onResize();
  }
}
