/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 { ColumnMeta, Metric } from '@superset-ui/chart-controls';
import { DatasourceType } from '@superset-ui/core';
import type { Datasource } from 'src/explore/types';
import type { QueryEditor } from 'src/SqlLab/types';
import { getDatasourceAsSaveableDataset } from './datasourceUtils';

const mockColumnMeta: ColumnMeta = {
  column_name: 'test_column',
  type: 'VARCHAR',
  is_dttm: false,
  verbose_name: 'Test Column',
  description: 'A test column',
  expression: '',
  filterable: true,
  groupby: true,
  id: 1,
  type_generic: 1,
  python_date_format: null,
  optionName: 'test_column',
};

const mockMetric: Metric = {
  id: 1,
  uuid: 'metric-1',
  metric_name: 'count',
  verbose_name: 'Count',
  description: 'Count of records',
  d3format: null,
  currency: null,
  warning_text: null,
  // optionName removed - not part of Metric interface
};

const mockDatasource: Datasource = {
  id: 1,
  type: DatasourceType.Table,
  columns: [mockColumnMeta],
  metrics: [mockMetric],
  column_formats: {},
  verbose_map: {},
  main_dttm_col: '',
  order_by_choices: null,
  datasource_name: 'Test Datasource',
  name: 'test_table',
  catalog: 'test_catalog',
  schema: 'test_schema',
  description: 'Test datasource',
  database: {
    id: 123,
    database_name: 'test_db',
    sqlalchemy_uri: 'postgresql://test',
  },
};

const mockQueryEditor: QueryEditor = {
  id: 'query-1',
  immutableId: 'immutable-query-1',
  version: 1,
  name: 'Test Query',
  sql: 'SELECT * FROM users',
  dbId: 456,
  autorun: false,
  remoteId: null,
  catalog: 'prod_catalog',
  schema: 'public',
  templateParams: '{"param1": "value1"}',
};

// eslint-disable-next-line no-restricted-globals -- TODO: Migrate from describe blocks
describe('getDatasourceAsSaveableDataset', () => {
  test('should convert Datasource object correctly', () => {
    const result = getDatasourceAsSaveableDataset(mockDatasource);

    expect(result).toEqual({
      columns: [mockColumnMeta],
      name: 'Test Datasource',
      dbId: 123,
      sql: '',
      catalog: 'test_catalog',
      schema: 'test_schema',
      templateParams: null,
    });
  });

  test('should convert QueryEditor object correctly', () => {
    const queryWithColumns = { ...mockQueryEditor, columns: [mockColumnMeta] };
    const result = getDatasourceAsSaveableDataset(queryWithColumns);

    expect(result).toEqual({
      columns: [mockColumnMeta],
      name: 'Test Query',
      dbId: 456,
      sql: 'SELECT * FROM users',
      catalog: 'prod_catalog',
      schema: 'public',
      templateParams: '{"param1": "value1"}',
    });
  });

  test('should handle datasource with fallback name from name property', () => {
    const datasourceWithoutDatasourceName: Datasource = {
      ...mockDatasource,
      datasource_name: null,
      name: 'fallback_name',
    };

    const result = getDatasourceAsSaveableDataset(
      datasourceWithoutDatasourceName,
    );

    expect(result.name).toBe('fallback_name');
  });

  test('should use "Untitled" as fallback when no name is available', () => {
    const datasourceWithoutName: Datasource = {
      ...mockDatasource,
      datasource_name: null,
      name: '',
    };

    const result = getDatasourceAsSaveableDataset(datasourceWithoutName);

    expect(result.name).toBe('Untitled');
  });

  test('should handle missing database object', () => {
    const datasourceWithoutDatabase: Datasource = {
      ...mockDatasource,
      database: undefined,
    };

    const result = getDatasourceAsSaveableDataset(datasourceWithoutDatabase);

    expect(result.dbId).toBe(0);
  });

  test('should handle QueryEditor with missing dbId', () => {
    const queryEditorWithoutDbId: QueryEditor = {
      ...mockQueryEditor,
      dbId: undefined,
    };

    const result = getDatasourceAsSaveableDataset(queryEditorWithoutDbId);

    expect(result.dbId).toBe(0);
  });

  test('should handle QueryEditor without sql property', () => {
    const queryEditorWithoutSql: QueryEditor = {
      ...mockQueryEditor,
      sql: '',
    };

    const result = getDatasourceAsSaveableDataset(queryEditorWithoutSql);

    expect(result.sql).toBe('');
  });

  test('should handle null values for optional properties', () => {
    const minimalQueryEditor: QueryEditor = {
      ...mockQueryEditor,
      catalog: null,
      schema: undefined,
      templateParams: '',
    };

    const result = getDatasourceAsSaveableDataset(minimalQueryEditor);

    expect(result.catalog).toBe(null);
    expect(result.schema).toBe(null);
    expect(result.templateParams).toBe(null);
  });
});
