class Link1Handler {

  constructor(headerSpace) {
    const elements = createBtnGroupArea('link-1-action-area', '0,1歳日誌データ連携', this.handleLink, {
      btnElId: 'link-1-btn',
      yearElId: 'link-1-year',
      monthElId: 'link-1-month',
    })
    if (!elements) {
      return;
    }
    headerSpace.appendChild(elements['link-1-action-area']);
  }

  handleLink = async (e, { year, month }) => {
    loading(true, '日誌データ連携中...');
    showError(false);
    const api = new KintoneRestAPIClient();

    // 本アプリからデータを読み取る
    const currentAppRecords = await this.getRecords(api, year, month);
    if (!currentAppRecords) {
      // エラー
      loading(false);
      return;
    }

    // console.log(currentAppRecords);
    const recordsWrapper = await this.generateRecords(api, year, month, currentAppRecords);
    // console.log(recordsWrapper);

    const result = await this.insertOrUpdateData(api, recordsWrapper);
    if (result) {
      // showSuccess(true, "日誌データ連携作成完了");
      this.showSuccessDialog(result, year, month);
    }
    loading(false);
  }

  showSuccessDialog(result, year, month) {
    const dateString = year + '年' + month + '月';
    const contentEl = document.createElement('div');
    contentEl.style.fontSize = '16px';
    if (result.updateResult && result.insertResult) {
      contentEl.innerHTML = `${dateString}の${result.updateResult.records.length}人の園児の日誌を更新し、${result.insertResult.records.length}人の園児の日誌を新規作成しました。`
    } else if (result.updateResult) {
      contentEl.innerHTML = `${dateString}の${result.updateResult.records.length}人の園児の日誌が更新されました。`;
    } else if (result.insertResult) {
      contentEl.innerHTML = `${dateString}の${result.insertResult.records.length}人の園児の日誌が生成されました`;
    } else {
      contentEl.innerHTML = `${dateString}の園児の日誌に生成するデータはありませんでした。`
    }
    showDialog({
      title: '日誌データ連携作成完了',
      content: contentEl,
      ok: 'アプリへ行く',
      cancel: '閉じる',
      onOk: () => { window.open(`${location.origin}/k/${env["0,1歳日誌出力用"].appId}/`) },
    });
  }

  insertOrUpdateData = async (api, recordsWrapper) => {
    try {
      const param = {
        app: env["0,1歳日誌出力用"].appId,
      }

      let insertResult;
      if (recordsWrapper['insert'].length) {
        param.records = recordsWrapper['insert'];
        insertResult = await api.record.addAllRecords(param);
      }

      let updateResult;
      if (recordsWrapper['update'].length) {
        param.records = recordsWrapper['update'];
        // 本アプリの当日データでテーブルを上書きし、対応する園児データがない行を【削除】します
        updateResult = await api.record.updateAllRecords(param);
      }

      return {
        recordsWrapper,
        insertResult,
        updateResult
      };
    } catch (e) {
      showError(true, '日誌データ連携作成失敗\n - ' + e);
    }
  };

  generateRecords = async (api, year, month, records) => {
    const generatedRecordIdMap = await this.getGeneratedRecordIdMap(api, year, month);
    if (!generatedRecordIdMap) {
      // エラー
      loading(false);
      return;
    }

    const kidsMap = {};
    records.forEach((record) => {
      const uniqueKey = record['園児ユニークキー'].value;
      let map = kidsMap[uniqueKey];
      if (!map) {
        map = {
          existId: generatedRecordIdMap[uniqueKey],
          list: [],
          '年': { 'value': Number(year) },
          '月': { 'value': Number(month) },
          '学年': { 'value': record['学年'].value },
          'クラス': { 'value': record['クラス'].value },
          '出席番号': { 'value': record['出席番号'].value },
          '園児名': { 'value': record['園児名'].value },
          '園児ユニークキー': { 'value': uniqueKey },
          '帳票出力用_テーブル': { 'value': undefined },
        };
        kidsMap[uniqueKey] = map
      }
      record['date'] = Number(record['登園日'].value.split('-')[2]);
      map.list.push(record);
    });
    // console.log(generatedRecordIdMap);
    // console.log(kidsMap);

    const result = {
      'update': [],
      'insert': []
    }

    Object.values(kidsMap).forEach((recordWrapper) => {
      const subtable = Array.from({ length: 31 }, (_e, i) => ({
        value: {
          '日付': { 'value': i + 1 },
        }
      }));
      recordWrapper.list.forEach((record) => {
        subtable[record['date'] - 1] = {
          value: {
            '日付': { 'value': record['date'] },
            '出欠': { 'value': record['出欠'].value },
            '降園': { 'value': record['帰園時刻'].value },
            '検温時刻1': { 'value': record['検温時刻1'].value },
            '体温1': { 'value': record['体温1'].value },
            '検温時刻2': { 'value': record['検温時刻2'].value },
            '体温2': { 'value': record['体温2'].value },
            '検温時刻3': { 'value': record['検温時刻3'].value },
            '体温3': { 'value': record['体温3'].value },
            '食事量': { 'value': record['食事量_結合'].value },
            '排便': { 'value': record['排便'].value },
            '睡眠開始時間1': { 'value': record['睡眠開始時間1'].value },
            '睡眠終了時間1': { 'value': record['睡眠終了時間1'].value },
            '睡眠開始時間2': { 'value': record['睡眠開始時間2'].value },
            '睡眠終了時間2': { 'value': record['睡眠終了時間2'].value },
            '保護者から': { 'value': record['保護者から'].value },
            '園での様子_伝達事項': { 'value': record['園での様子_伝達事項'].value },
            '評価反省': { 'value': record['評価反省'].value },
          }
        }
      })
      recordWrapper['帳票出力用_テーブル'].value = subtable;
      const id = recordWrapper['existId'];
      delete recordWrapper['list'];
      delete recordWrapper['existId'];
      if (id) {
        result['update'].push({
          id,
          record: recordWrapper
        });
      } else {
        result['insert'].push(recordWrapper);
      }
    });

    return result;
  }

  getRecords = async (api, year, month) => {
    const firstDate = getFormatDateString(year, month, 1)
    const lastDate = getFormatDateString(getLastDate(year, month));
    try {
      return await api.record.getAllRecordsWithId({
        app: env["園児別出欠簿入力"].appId,
        condition: `学年 in ("０歳児", "１歳児") and 登園日 >= "${firstDate}" and 登園日 <= "${lastDate}"`
      });
    } catch (e) {
      showError(true, '本アプリのデータ読み取りエラー\n - ' + e);
      loading(false);
    }
  }

  getGeneratedRecordIdMap = async (api, year, month) => {
    try {
      const result = await api.record.getAllRecordsWithId({
        app: env["0,1歳日誌出力用"].appId,
        fields: ["$id", "園児ユニークキー"],
        condition: `年 = ${year} and 月 = ${month}`
      });
      const map = {}
      result.forEach((record) => {
        const uniqueKey = record['園児ユニークキー'].value;
        map[uniqueKey] = record['$id'].value;
      });
      return map;
    } catch (e) {
      showError(true, '日誌データ読み取りエラー\n - ' + e);
      loading(false);
    }
  }

  static getInstance(headerSpace) {
    if (!Link1Handler.instance) {
      Link1Handler.instance = new Link1Handler(headerSpace);
    }
    return Link1Handler.instance;
  }
}
