/**
 * @license
 * Copyright 2026 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
import '../../../test/common-test-setup';
import './gr-diff-markdown-viewer';
import {GrDiffMarkdownViewer} from './gr-diff-markdown-viewer';
import {fixture, html} from '@open-wc/testing';
// Until https://github.com/modernweb-dev/web/issues/2804 is fixed
// @ts-expect-error
import {visualDiff} from '@web/test-runner-visual-regression';
import {visualDiffDarkTheme} from '../../../test/test-utils';
import {createDiff, createPatchRange} from '../../../test/test-data-generators';
import {DiffInfo, DiffViewMode} from '../../../api/diff';

suite('gr-diff-markdown-viewer screenshot tests', () => {
  let element: GrDiffMarkdownViewer;

  setup(async () => {
    const diff: DiffInfo = {
      ...createDiff(),
      meta_a: {
        name: 'SKILL.md',
        content_type: 'text/markdown',
        lines: 25,
      },
      meta_b: {
        name: 'SKILL.md',
        content_type: 'text/markdown',
        lines: 25,
      },
      content: [
        {
          ab: ['## Running the Experiment', ''],
        },
        {
          a: [
            'The generalized runner script is located at [run_experiment.py](file:///path/to/workspace/tools/build_experimentation/scripts/run_experiment.py).',
          ],
          b: [
            'The generalized runner script is located at [`scripts/run_experiment.py`](scripts/run_experiment.py) (relative to this `SKILL.md` directory, `<SKILL_DIR>`). It automatically resolves the workspace root from `--workspace-root`, `workspace_root` in the JSON config, `$ANDROID_BUILD_TOP`, or the nearest ancestor directory containing `.repo/`.',
          ],
        },
        {
          ab: [
            '',
            '### Execution',
            '',
            'Run the script from the build top directory, passing the path to your config file:',
            '',
            '```bash',
          ],
        },
        {
          a: [
            'python3 tools/build_experimentation/scripts/run_experiment.py --config path/to/config.json',
          ],
          b: [
            'python3 <SKILL_DIR>/scripts/run_experiment.py --config path/to/config.json',
          ],
        },
        {
          ab: [
            '```',
            '',
            'By default, running this command will clear any existing results in `out/experiment_results.json`.',
            '',
            '#### Appending Results (Opt-in)',
            'To append results to a prior run (e.g., to add more iterations to an existing experiment), use the `--append` flag:',
            '',
            '```bash',
          ],
        },
        {
          a: [
            'python3 tools/build_experimentation/scripts/run_experiment.py --config path/to/config.json --append',
          ],
          b: [
            'python3 <SKILL_DIR>/scripts/run_experiment.py --config path/to/config.json --append',
          ],
        },
        {
          ab: [
            '```',
            '',
            'This will preserve existing results, start iteration numbering from where the last run left off, and avoid clearing preserved artifacts.',
          ],
        },
      ],
    };

    element = await fixture<GrDiffMarkdownViewer>(
      html`<gr-diff-markdown-viewer
        style="display: block; width: 1200px;"
        .diff=${diff}
        .path=${'SKILL.md'}
        .patchRange=${createPatchRange()}
      ></gr-diff-markdown-viewer>`
    );
    await element.updateComplete;
    await document.fonts?.ready;
  });

  test('side-by-side rich diff with inline code spans', async () => {
    await visualDiff(element, 'gr-diff-markdown-viewer-inline-code');
    await visualDiffDarkTheme(element, 'gr-diff-markdown-viewer-inline-code');
  });

  test('unified rich diff with inline code spans', async () => {
    element.viewMode = DiffViewMode.UNIFIED;
    await element.updateComplete;

    await visualDiff(element, 'gr-diff-markdown-viewer-inline-code-unified');
    await visualDiffDarkTheme(
      element,
      'gr-diff-markdown-viewer-inline-code-unified'
    );
  });

  test('rich diff showcase with lists, tables, blockquotes, and code blocks', async () => {
    element.diff = {
      ...createDiff(),
      meta_a: {name: 'README.md', content_type: 'text/markdown', lines: 30},
      meta_b: {name: 'README.md', content_type: 'text/markdown', lines: 32},
      content: [
        {
          a: [
            '# Service Configuration Guide',
            '',
            '> Note: Legacy v1 endpoints are deprecated and will be removed in Q3.',
            '',
            '- Enable `--legacy-auth` when starting the local worker.',
            '- Configure timeout in `config/default.yaml` (default: `30s`).',
            '- Upload logs to [metrics-v1](https://example.com/metrics/v1).',
            '',
            '| Flag | Default | Description |',
            '| --- | --- | --- |',
            '| `--threads` | `4` | Worker thread pool size |',
            '| `--timeout` | `30s` | Request deadline per RPC |',
          ],
          b: [
            '# Service Configuration Guide',
            '',
            '> Note: Legacy v1 endpoints are deprecated and will be removed in Q4.',
            '',
            '- Enable `--oauth2-auth` when starting the local worker.',
            '- Configure timeout in `config/production.yaml` (default: `60s`).',
            '- Upload logs to [metrics-v2](https://example.com/metrics/v2).',
            '- Verify health check at `/healthz` before traffic cutover.',
            '',
            '| Flag | Default | Description |',
            '| --- | --- | --- |',
            '| `--threads` | `8` | Worker thread pool size |',
            '| `--timeout` | `60s` | Request deadline per streaming RPC |',
          ],
        },
      ],
    };
    await element.updateComplete;
    await document.fonts?.ready;

    await visualDiff(element, 'gr-diff-markdown-viewer-delta-showcase');
    await visualDiffDarkTheme(
      element,
      'gr-diff-markdown-viewer-delta-showcase'
    );
  });
});
