// Copyright (C) 2024 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 {test, Page} from '@playwright/test';
import {PerfettoTestHelper} from './perfetto_ui_test_helper';
import {assertExists} from '../base/logging';

test.describe.configure({mode: 'serial'});

let pth: PerfettoTestHelper;
let page: Page;

test.beforeAll(async ({browser}, _testInfo) => {
  page = await browser.newPage();
  pth = new PerfettoTestHelper(page);
  await pth.openTraceFile('api34_startup_cold.perfetto-trace');
});

test('sched', async () => {
  await page.mouse.move(600, 250);
  await page.mouse.down();
  await page.mouse.move(800, 350);
  await page.mouse.up();
  await pth.waitForPerfettoIdle();
  await pth.waitForIdleAndScreenshot('cpu-by-thread.png');

  await page.click('button[label="CPU by process"]');
  await pth.waitForIdleAndScreenshot('cpu-by-process.png');

  // Now test sorting.

  const hdr = page.getByRole('cell', {name: 'Avg Wall duration (ms)'});
  await hdr.click();
  await pth.waitForIdleAndScreenshot('sort-by-wall-duration.png');

  await hdr.click();
  await pth.waitForIdleAndScreenshot('sort-by-wall-duration-desc.png');

  await page.getByRole('cell', {name: 'Occurrences'}).click();
  await pth.waitForIdleAndScreenshot('sort-by-occurrences.png');
});

test('gpu counter', async () => {
  await page.keyboard.press('Escape');
  const gpuTrack = pth.locateTrack('Gpu 0 Frequency');
  const coords = assertExists(await gpuTrack.boundingBox());
  await page.mouse.move(600, coords.y + 10);
  await page.mouse.down();
  await page.mouse.move(800, coords.y + 60);
  await page.mouse.up();
  await pth.waitForIdleAndScreenshot('gpu-counter-aggregation.png');
});

test('frametimeline', async () => {
  await page.keyboard.press('Escape');
  const sysui = pth.locateTrack('com.android.systemui 25348');
  await sysui.scrollIntoViewIfNeeded();
  await pth.toggleTrackGroup(sysui);
  const actualTimeline = pth.locateTrack(
    'com.android.systemui 25348/Actual Timeline',
    sysui,
  );
  const coords = assertExists(await actualTimeline.boundingBox());
  await page.mouse.move(600, coords.y + 10);
  await page.mouse.down();
  await page.mouse.move(1000, coords.y + 20);
  await page.mouse.up();
  await pth.waitForIdleAndScreenshot('frame-timeline-aggregation.png');
});

test('slices', async () => {
  await page.keyboard.press('Escape');
  const syssrv = pth.locateTrack('system_server 1719');
  await syssrv.scrollIntoViewIfNeeded();
  await pth.toggleTrackGroup(syssrv);
  const animThread = pth
    .locateTrack('system_server 1719/android.anim 1754', syssrv)
    .nth(1);
  await animThread.scrollIntoViewIfNeeded();
  await pth.waitForPerfettoIdle();
  const coords = assertExists(await animThread.boundingBox());
  await page.mouse.move(600, coords.y + 10);
  await page.mouse.down();
  await page.mouse.move(1000, coords.y + 20);
  await page.mouse.up();
  await pth.waitForIdleAndScreenshot('slice-aggregation.png');
});
