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

import type { LoggerType } from '../../types/Logging';
import { sql } from '../util';
import type { WritableDB } from '../Interface';
import { getOurUuid } from './41-uuid-keys';

export const version = 1020;

export function updateToSchemaVersion1020(
  currentVersion: number,
  db: WritableDB,
  logger: LoggerType
): void {
  if (currentVersion >= 1020) {
    return;
  }

  db.transaction(() => {
    const ourAci = getOurUuid(db);

    if (ourAci == null) {
      logger.info('updateToSchemaVersion1020: not linked');
      db.pragma('user_version = 1020');
      return;
    }

    const [selectQuery, selectParams] = sql`
      SELECT id FROM conversations
      WHERE serviceId IS ${ourAci}
    `;
    const ourConversationId = db
      .prepare(selectQuery, {
        pluck: true,
      })
      .get(selectParams);
    if (ourConversationId == null) {
      logger.error('updateToSchemaVersion1020: no conversation');
      db.pragma('user_version = 1020');
      return;
    }

    const [deleteQuery, deleteParams] = sql`
      DELETE FROM messages
      WHERE
        conversationId IS ${ourConversationId} AND
        type IS 'conversation-merge'
    `;
    const { changes } = db.prepare(deleteQuery).run(deleteParams);
    if (changes !== 0) {
      logger.warn(`updateToSchemaVersion1020: removed ${changes} self merges`);
    }

    db.pragma('user_version = 1020');
  })();

  logger.info('updateToSchemaVersion1020: success!');
}
