/*
 * Copyright (C) 2024 Huawei Device Co., Ltd.
 * 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 { query } from "../SqlLite";
import { CpuAndIrqBean} from "../../component/trace/sheet/cpu/CpuAndIrqBean";
export const getCpuData = (cpus: Array<number>, leftNS: number, rightNS: number): Promise<Array<CpuAndIrqBean>> =>
    query(
      'getCpuData',
      `
      SELECT
        TS.pid AS pid,
        TS.tid AS tid,
        TS.cpu,
        'cpu' AS cat,
        1 As occurrences,
        1 As priority,
        true As isFirstObject,
        MAX(${leftNS},TS.ts - TR.start_ts) AS startTime,
        MIN(${rightNS},(TS.ts - TR.start_ts + iif(TS.dur = -1 OR TS.dur IS NULL, 0, TS.dur))) AS endTime,
        MIN(${rightNS},(TS.ts - TR.start_ts + iif(TS.dur = -1 OR TS.dur IS NULL, 0, TS.dur))) - MAX(${leftNS},TS.ts - TR.start_ts) AS dur,
        TS.ts - TR.start_ts AS originalStartTime,
        TS.ts - TR.start_ts + iif(TS.dur = -1 OR TS.dur IS NULL, 0, TS.dur) AS originalEndTime
      FROM
        thread_state AS TS
      LEFT JOIN
        trace_range AS TR
      WHERE
        TS.cpu IN (${cpus.join(',')})
      AND
        NOT ((TS.ts - TR.start_ts + iif(TS.dur = -1 OR TS.dur IS NULL, 0, TS.dur) < ${leftNS}) OR (TS.ts - TR.start_ts > ${rightNS}))`
    );
export const getIrqAndSoftIrqData = (cpus: Array<number>, leftNS: number, rightNS: number): Promise<Array<CpuAndIrqBean>> =>{
  return query(
    'getIrqAndSoftIrqData',
    `
    SELECT
      CASE
        WHEN i.cat = 'softirq'
        THEN 'softirq'
        ELSE 'irq'
        END AS cat,
      CASE
        WHEN i.cat = 'softirq'
        THEN 2
        ELSE 3
        END AS priority,
      i.callid as cpu,
      1 As occurrences,
      true As isFirstObject,
      MAX(${leftNS},i.ts - TR.start_ts) AS startTime,
      MIN(${rightNS},(i.ts - TR.start_ts + iif(i.dur = -1 OR i.dur IS NULL, 0, i.dur))) AS endTime,
      MIN(${rightNS},(i.ts - TR.start_ts + iif(i.dur = -1 OR i.dur IS NULL, 0, i.dur))) - MAX(${leftNS},i.ts - TR.start_ts) AS dur,
      i.ts - TR.start_ts AS originalStartTime,
      i.ts - TR.start_ts + iif(i.dur = -1 OR i.dur IS NULL, 0, i.dur) AS originalEndTime
    FROM
      irq i
    LEFT JOIN
      trace_range AS TR
    WHERE
      i.callid IN (${cpus.join(',')})
    AND
      NOT ((i.ts - TR.start_ts + iif(i.dur = -1 OR i.dur IS NULL, 0, i.dur) < ${leftNS}) OR (i.ts - TR.start_ts > ${rightNS}))
    AND ( ( i.cat = 'irq' AND i.flag = '1' ) OR i.cat = 'ipi' OR  i.cat = 'softirq' )`
  );
}