// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only

import { assert } from 'chai';

import type { WritableDB } from '../../sql/Interface';
import { createDB, updateToVersion, insertData, getTableData } from './helpers';

describe('SQL/updateToSchemaVersion90', () => {
  let db: WritableDB;

  beforeEach(() => {
    db = createDB();
  });

  afterEach(() => {
    db.close();
  });

  it('should delete screenshot.data but leave remainder', () => {
    updateToVersion(db, 89);
    insertData(db, 'messages', [
      {
        id: 'message_with_screenshot_data',
        json: {
          id: 'message_with_screenshot_data',
          storyReplyContext: {
            attachment: {
              contentType: 'video/mp4',
              filename: 'filename',
              path: 'path',
              screenshot: {
                contentType: 'image/png',
                path: 'screenshotPath',
                width: 1920,
                height: 1080,
              },
              screenshotData: {
                '4389410': 144,
                '4389411': 255,
                '4389412': 75,
                '4389413': 168,
                '4389414': 81,
                '4389415': 142,
                '4389416': 120,
                '4389417': 150,
                '4389418': 14,
              },
              size: 100,
            },
            messageId: 'story_id',
          },
        },
        storyId: 'story_id',
      },
    ]);

    updateToVersion(db, 90);

    assert.deepStrictEqual(
      getTableData(db, 'messages').map(msg => msg.json),
      [
        {
          id: 'message_with_screenshot_data',
          storyReplyContext: {
            attachment: {
              contentType: 'video/mp4',
              filename: 'filename',
              path: 'path',
              screenshot: {
                contentType: 'image/png',
                path: 'screenshotPath',
                width: 1920,
                height: 1080,
              },
              size: 100,
            },
            messageId: 'story_id',
          },
        },
      ]
    );
  });

  it('should use storyId index', () => {
    updateToVersion(db, 90);

    const details = db
      .prepare(
        `
        EXPLAIN QUERY PLAN
        UPDATE messages
        SET json = json_remove(json, '$.storyReplyContext.attachment.screenshotData')
        WHERE isStory = 0
        AND storyId > '0'
        AND json->'storyReplyContext.attachment.screenshotData' IS NOT NULL;
        `
      )
      .all()
      .map(({ detail }) => detail)
      .join('\n');

    assert.include(details, 'USING INDEX messages_by_storyId');
    assert.notInclude(details, 'SCAN');
  });
});