// 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.

import {sqliteString} from '../../base/string_utils';

import {
  ArgSetIdColumn,
  dependendentColumns,
  DisplayConfig,
  RegularSqlTableColumn,
} from './table_description';

// This file contains the defintions of different column types that can be
// displayed in the table viewer.

export interface Column {
  // SQL expression calculating the value of this column.
  expression: string;
  // Unique name for this column.
  // The relevant bit of SQL fetching this column will be ${expression} as
  // ${alias}.
  alias: string;
  // Title to be displayed in the table header.
  title: string;
  // How the value of this column should be rendered.
  display?: DisplayConfig;
}

export function columnFromSqlTableColumn(c: RegularSqlTableColumn): Column {
  return {
    expression: c.name,
    alias: c.name,
    title: c.title || c.name,
    display: c.display,
  };
}

export function argColumn(c: ArgSetIdColumn, argName: string): Column {
  const escape = (name: string) => name.replace(/\.|\[|\]/g, '_');
  return {
    expression: `extract_arg(${c.name}, ${sqliteString(argName)})`,
    alias: `_arg_${c.name}_${escape(argName)}`,
    title: `${c.title ?? c.name} ${argName}`,
  };
}

// Returns a list of projections (i.e. parts of the SELECT clause) that should
// be added to the query fetching the data to be able to display the given
// column (e.g. `foo` or `f(bar) as baz`).
// Some table columns are backed by multiple SQL columns (e.g. slice_id is
// backed by id, ts, dur and track_id), so we need to return a list.
export function sqlProjectionsForColumn(column: Column): string[] {
  return [`${column.expression} as ${column.alias}`].concat(
      dependendentColumns(column.display).map((c) => `${c} as ${c}`));
}
