// Copyright (C) 2023 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Object to facilitate generation of SELECT statement using
// generateSqlWithInternalLayout.
//
// Fields:
// @columns: a string array list of the columns to be selected from the table.
// @layoutParams: a config of the timestamp (ts) and duration (dur) fields
// required by the internal_layout function.
// @sourceTable: the table in the FROM clause, source of the data.
// @whereClause: the WHERE clause to filter data from the source table.
// @orderByClause: the ORDER BY clause for the query data.
interface GenerateSqlArgs {
  columns: string[];
  layoutParams: {ts: string, dur: string};
  sourceTable: string;
  whereClause?: string;
  orderByClause?: string;
}

// Function to generate a SELECT statement utilizing the internal_layout
// SQL function as a depth field.
export function generateSqlWithInternalLayout(sqlArgs: GenerateSqlArgs):
    string {
  let sql = `SELECT ` + sqlArgs.columns.toString() + ', internal_layout(' +
      sqlArgs.layoutParams.ts + ',' + sqlArgs.layoutParams.dur +
      ') OVER (ORDER BY ' + sqlArgs.layoutParams.ts +
      ' ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS depth' +
      ' FROM ' + sqlArgs.sourceTable;
  if (sqlArgs.whereClause !== undefined) {
    sql += ' WHERE ' + sqlArgs.whereClause;
  }
  if (sqlArgs.orderByClause !== undefined) {
    sql += ' ORDER BY ' + sqlArgs.orderByClause;
  }
  sql += ';';
  return sql;
}
