require('dotenv').config(); // .envファイルを環境変数として読み込み
const fs = require('fs');
// 保存ファイル名
const fileName = 'report.csv';
// レポートのプロパティID
const propertyId = '000000000';
// Google Analytics Data API client library 読み込み
const {BetaAnalyticsDataClient} = require('@google-analytics/data');
// AnalyticsDataClientの初期化
const analyticsDataClient = new BetaAnalyticsDataClient();
// レポートの実行
async function runReport() {
  const [response] = await analyticsDataClient.runReport({
    property: `properties/${propertyId}`,
    dateRanges: [
      {
        startDate: '7daysAgo', // 念の為1週間前から取得する
        endDate: 'yesterday', // 前日まで取得
      },
    ],
    dimensions: [ // ディメンジョンの指定
      {
        name: 'date',
      },
    ],
    metrics: [ // メトリックスの指定
      {
        name: 'activeUsers', // ユニークユーザー
      },
      {
        name: 'screenPageViews', // 全体のページビュー
      }
    ],
  });
  // レポートデータの抽出
  let reportData = [];
  for (const row of response.rows) {
    reportData.push([row.dimensionValues[0].value].concat(row.metricValues.map(value => value.value)));
  }
  // 順番が順不同になっているので日付順に並べ替え
  reportData = reportData.sort((a, b) => a[0] - b[0]);
  // 保存済みのファイルがあれば読み込む
  const text = fs.existsSync(fileName) ? fs.readFileSync(fileName).toString() : '';
  // 保存済みの最新日の取得
  let lastDate = '0';
  if (text) {
    const lastLine = text.split('\r\n').pop();
    lastDate = lastLine.split(',')[0].replaceAll('-', '');
    if (isNaN(lastDate)) {
      lastDate = '0';
    }
  }
  if (!text) {
    // 保存済みファイルがない場合はヘッダーを書き込み
    const header = [response.dimensionHeaders[0].name].concat(response.metricHeaders.map(header => header.name)).join(',');
    fs.writeFileSync(fileName, header);
  }
  // 書き込み用データ
  const appendLines = [''];
  for (const data of reportData) {
    const dateValue = data[0];
    // 保存済みの最新日より新しい日付のみ追記する
    if (dateValue > lastDate) {
      data[0] = formatDate(dateValue);;
      appendLines.push(data.join(','));
    }
  }
  const appendText = appendLines.join('\r\n');
  if (appendText) {
    fs.appendFileSync(fileName, appendText);
  }
}
// 日付を"XXXX-XX-XX"形式に変換
function formatDate(value) {
  return [value.substring(0, 4), value.substring(4, 6), value.substring(6)].join('-');
}
runReport();