import { Component, Input, OnInit } from '@angular/core';
import { CommonModule } from '@angular/common';
import { NzSpaceModule } from 'ng-zorro-antd/space';
import { CommonCompModule } from '../../../../services/common.modules';
import { ActivatedRoute, Router } from '@angular/router';
import { NzMessageModule } from 'ng-zorro-antd/message';
import { NzMessageService } from 'ng-zorro-antd/message';
import Parse from 'parse';
import { textbookServer } from '../../../../services/textbook';
import { NzModalService } from 'ng-zorro-antd/modal';
import { MatDialog } from '@angular/material/dialog';
import { NzEmptyModule } from 'ng-zorro-antd/empty';
import { DatePipe } from '@angular/common';
import { NzPopoverModule } from 'ng-zorro-antd/popover';

@Component({
  selector: 'app-review-details',
  templateUrl: './review-details.component.html',
  styleUrls: ['./review-details.component.scss'],
  imports: [
    CommonModule,
    NzSpaceModule,
    CommonCompModule,
    NzMessageModule,
    NzEmptyModule,
    NzPopoverModule,
  ],
  providers: [DatePipe],
  standalone: true,
})
export class ReviewDetailsComponent implements OnInit {
  reviewList: Array<Parse.Object> = [];
  count: number = 0;
  @Input('limit') limit: number = 10;
  pageIndex: number = 1;
  loading: boolean = false;
  @Input('maxWidth') maxWidth: any; //最大宽度
  @Input('eduProcess') eduProcess?: Parse.Object; //流程id，verify存在时需要

  @Input('listOfFilter') listOfFilter: Array<any> = []; //评审组
  @Input('filterObj') filterObj: any = {
    showGroup: false,
    contained: [],
    bookMap: {}, //教材对应评审组结构{booid:评审组名称}
  };
  searchValue: string = '';
  listOfColumns: any = {
    lang: {
      // listOfFilter: [{ value: '中文', text: '中文' }],
      onChange: (data: Array<string>) => {
        console.log(data);
        if (data?.length < 1) {
          this.filterObj.contained = Object.keys(this.filterObj.bookMap);
        } else {
          this.filterObj.contained = [];
          for (const key in this.filterObj.bookMap) {
            const item = this.filterObj.bookMap[key];
            if (data.includes(item.id)) {
              this.filterObj.contained.push(key);
            }
          }
        }
        this.getTextbook(this.searchValue);
      },
    },
  };

  showLoading: boolean = false; //全局
  time: any;
  /* 格式化拓展表字段 */
  fromatFiled(list: Array<Parse.Object>, filed: string): string {
    let arr: Array<string | null> = [];
    let isDate = false;
    list.forEach((item: Parse.Object) => {
      // arr.add(item.get(filed))
      if (
        isDate ||
        Object.prototype.toString.call(item.get(filed)).indexOf('Date') != -1
      ) {
        arr.push(this.datePipe.transform(item.get(filed), 'yyyy-MM'));
        isDate = true;
      } else {
        arr.push(item.get(filed));
      }
    });
    let j = Array.from(arr).join(',');
    if (!isDate) {
      j = Array.from(new Set(arr)).join(' ');
    }
    return j || '-';
  }

  constructor(
    private activeRoute: ActivatedRoute,
    public tbookSer: textbookServer,
    private router: Router,
    private msg: NzMessageService,
    public dialog: MatDialog,
    private route: Router,
    private datePipe: DatePipe,
    private modal: NzModalService
  ) {}

  ngOnInit() {
    this.getTextbook();
  }
  async getTextbook(val?: string, exported?: boolean): Promise<any[] | void> {
    if (this.loading) return;
    if (!exported) this.loading = true;
    try {
      let queryParams: any = {
        where: {
          $or: [
            {
              eduTextbook: {
                $inQuery: {
                  where: {
                    $or: [
                      {
                        title: { $regex: `.*${val || ''}.*` },
                      },
                      {
                        childrens: {
                          $inQuery: {
                            where: {
                              $or: [
                                {
                                  ISBN: { $regex: `.*${val || ''}.*` },
                                },
                                {
                                  author: { $regex: `.*${val || ''}.*` },
                                },
                              ],
                            },
                            className: 'EduTextbookVolume',
                          },
                        },
                      },
                    ],
                  },
                  className: 'EduTextbook',
                },
              },
            },
            {
              profile: {
                $inQuery: {
                  where: {
                    $or: [
                      {
                        user: {
                          $inQuery: {
                            where: {
                              $or: [
                                {
                                  name: { $regex: `.*${val || ''}.*` },
                                },
                              ],
                            },
                            className: '_User',
                          },
                        },
                      },
                    ],
                  },
                  className: 'Profile',
                },
              },
            },
          ],
          eduTextbook: { $in: this.filterObj.contained },
        },
      };
      let query = Parse.Query.fromJSON('EduReview', queryParams);
      this.eduProcess?.id && query.equalTo('eduProcess', this.eduProcess.id);
      query.descending('updatedAt');
      query.notEqualTo('isDeleted', true);
      query.exists('score');
      query.equalTo('verify',true)
      query.include(
        'eduTextbook',
        'eduTextbook.childrens',
        'profile',
        'profile.user'
      );
      this.count = await query.count();
      query.limit(this.limit);
      query.skip(this.limit * (this.pageIndex - 1));
      if (exported) {
        query.limit(1000);
        let r = await query.find();
        this.loading = false;
        return r;
      }
      this.reviewList = await query.find();
      console.log(this.reviewList);
      this.loading = false;
    } catch (err) {
      console.warn(err);
      this.msg.error('获取超时');
    }
    this.loading = false;
  }
  onSearch(e: string) {
    this.pageIndex = 1;
    console.log(e);
    if (this.time) clearTimeout(this.time);
    this.time = setTimeout(() => {
      this.getTextbook(e);
    }, 500);
  }
  //分页切换
  pageIndexChange(e: any) {
    console.log(e);
    this.pageIndex = e;
    this.getTextbook(this.searchValue);
  }
  //切换分页条数
  onPageSizeChange(): void {
    console.log(this.limit);
    // this.onAllChecked(false)
    this.pageIndex = 1;
    this.getTextbook(this.searchValue);
  }

  toUrl(url: string, param?: Object) {
    console.log(url);
    if (param) {
      this.route.navigate([url, param]);
      return;
    }
    this.route.navigate([url]);
  }

  //导出表格
  async export() {
    if (this.showLoading) return;
    this.showLoading = true;
    try {
      let table;
      let data: any = await this.getTextbook('', true);
      if (this.filterObj.showGroup) {
        table = this.getActivityTable(data);
      } else {
        table = this.getTable(data);
      }
      let title = '评审明细表';
      this.excel(table, `${title}.xls`);
      this.showLoading = false;
    } catch (err) {
      console.log(err);
      this.showLoading = false;
      this.msg.error('导出超时');
    }
  }
  //合并后（活动详情）
  getActivityTable(data: Array<Parse.Object>): string {
    let groupMap: any = {};
    data.forEach((item: Parse.Object) => {
      let obj = {
        name: item?.get('profile')?.get('user')?.get('name'),
        score: item?.get('score'),
      };
      if (!groupMap[item?.get('eduTextbook')?.id]) {
        groupMap[item?.get('eduTextbook')?.id] = {
          eduTextbook: item?.get('eduTextbook'),
          groupList: [obj],
        };
      } else {
        groupMap[item?.get('eduTextbook')?.id]['groupList'].push(obj);
      }
    });
    console.log(groupMap);

    let table = `<table border="1px" cellspacing="0" cellpadding="0">
    <thead>
      <tr>
        <th>序号</th>
        <th>教材申报编号</th>
        <th>申报教材名称</th>
        <th>所属学科专业类</th>
        <th>第一主编/作者</th>
        <th>出版单位</th>
    `;
    let l = 0;
    let dataLsit: any = Object.values(groupMap);
    dataLsit.forEach((val: any) => {
      if (val?.groupList.length > l) l = val?.groupList.length;
    });
    for (let index = 0; index < l; index++) {
      table += `<th>评审专家${index + 1}</th>`;
    }
    table += `
        <th>平均分值（若为空请点击计算后再导出）</th>
      </tr>
    </thead>
    <tbody>`;
    let _body = '';
    for (var row = 0; row < dataLsit.length; row++) {
      _body += '<tr>';
      _body += '<td>';
      _body += `${row + 1}`;
      _body += '</td>';

      _body += '<td>';
      _body += `&nbsp;${dataLsit[row]?.eduTextbook?.get('code') || ''}`;
      _body += '</td>';

      _body += '<td>';
      _body += `&nbsp;${dataLsit[row]?.eduTextbook?.get('title') || ''}`;
      _body += '</td>';

      _body += '<td>';
      _body += `&nbsp;${
        (dataLsit[row]?.eduTextbook?.get('majorPoniter')?.code || '') +
          '/' +
          dataLsit[row]?.eduTextbook?.get('majorPoniter')?.name || ''
      }`;
      _body += '</td>';

      _body += '<td>';
      _body += `&nbsp;${this.fromatFiled(
        dataLsit[row]?.eduTextbook?.get('childrens'),
        'author'
      )}`;
      _body += '</td>';

      _body += '<td>';
      _body += `${this.fromatFiled(
        dataLsit[row]?.eduTextbook?.get('childrens'),
        'editionUnit'
      )}`;
      _body += '</td>';

      for (let i = 0; i < l; i++) {
        const element = dataLsit[row]['groupList'][i];
        _body += '<td>';
        _body += `${element?.name ?? ''} ${element?.score??''}`;
        _body += '</td>';
      }

      // _body += '<td>';
      // _body += ` &nbsp;${
      //   this.filterObj.bookMap[dataLsit[row]?.eduTextbook?.id].name || '-'
      // }`;
      // _body += '</td>';

      // _body += '<td>';
      // _body += `${
      //   dataLsit[row]?.get('profile')?.get('user')?.get('name') || '-'
      // }`;
      // _body += '</td>';

      // _body += '<td>';
      // _body += `&nbsp;${this.datePipe.transform(
      //   dataLsit[row]?.updatedAt,
      //   'yyyy-MM-dd HH:mm:ss'
      // )}`;
      // _body += '</td>';

      _body += '<td>';
      _body += `${dataLsit[row]?.eduTextbook?.get('score') ?? '-'}`;
      _body += '</td>';

      _body += '</tr>';
    }
    table += _body;
    table += '</tbody>';
    table += '</table>';
    return table;
  }
  //非合并（评审组详情）
  getTable(data: Array<Parse.Object>): string {
    let table = `<table border="1px" cellspacing="0" cellpadding="0">
    <thead>
      <tr>
        <th>序号</th>
        <th>教材申报编号</th>
        <th>申报教材名称</th>
        <th>所属学科专业类</th>
        <th>第一主编/作者</th>
        <th>出版单位</th>
        <th>评审专家</th>
        <th>提交时间</th>
        <th>分值</th>
      </tr>
    </thead>
    <tbody>
    `;
    let _body = '';
    for (var row = 0; row < data.length; row++) {
      _body += '<tr>';
      _body += '<td>';
      _body += `${row + 1}`;
      _body += '</td>';

      _body += '<td>';
      _body += `&nbsp;${data[row]?.get('eduTextbook')?.get('code') || ''}`;
      _body += '</td>';

      _body += '<td>';
      _body += `&nbsp;${data[row]?.get('eduTextbook')?.get('title') || ''}`;
      _body += '</td>';

      _body += '<td>';
      _body += `&nbsp;${
        (data[row]?.get('eduTextbook')?.get('majorPoniter')?.code || '') +
          '/' +
          data[row]?.get('eduTextbook')?.get('majorPoniter')?.name || ''
      }`;
      _body += '</td>';

      _body += '<td>';
      _body += `&nbsp;${this.fromatFiled(
        data[row]?.get('eduTextbook')?.get('childrens'),
        'author'
      )}`;
      _body += '</td>';

      _body += '<td>';
      _body += `${this.fromatFiled(
        data[row]?.get('eduTextbook')?.get('childrens'),
        'editionUnit'
      )}`;
      _body += '</td>';

      // if (this.filterObj.showGroup) {
      //   _body += '<td>';
      //   _body += ` &nbsp;${
      //     this.filterObj.bookMap[data[row]?.get('eduTextbook')?.id].name ||
      //     '-'
      //   }`;
      //   _body += '</td>';
      // }

      _body += '<td>';
      _body += `${data[row]?.get('profile')?.get('user')?.get('name') || '-'}`;
      _body += '</td>';

      _body += '<td>';
      _body += `&nbsp;${this.datePipe.transform(
        data[row]?.updatedAt,
        'yyyy-MM-dd HH:mm:ss'
      )}`;
      _body += '</td>';

      _body += '<td>';
      _body += `${data[row]?.get('score') ?? '-'}`;
      _body += '</td>';

      _body += '</tr>';
    }
    table += _body;
    table += '</tbody>';
    table += '</table>';
    return table;
  }

  excel(data: any, filename: string) {
    let html =
      "<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:x='urn:schemas-microsoft-com:office:excel' xmlns='http://www.w3.org/TR/REC-html40'>";
    html +=
      '<meta http-equiv="content-type" content="application/vnd.ms-excel; charset=UTF-8">';
    html += '<meta http-equiv="content-type" content="application/vnd.ms-excel';
    html += '; charset=UTF-8">';
    html += '<head>';
    html += '</head>';
    html += '<body>';
    html += data;
    html += '</body>';
    html += '</html>';
    let uri =
      'data:application/vnd.ms-excel;charset=utf-8,' + encodeURIComponent(html);
    let link = document.createElement('a');
    link.href = uri;
    link.download = `${filename}`;
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
  }
}
