/**
 * @license
 * Copyright 2025 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
import {testResolver} from '../../test/common-test-setup';
import {
  FlowsModel,
  getChangePrefix,
  getSubmitCondition,
  SUBMIT_ACTION_NAME,
} from './flows-model';
import {ChangeModel, changeModelToken} from '../change/change-model';
import {PluginsModel} from '../plugins/plugins-model';
import {stubRestApi, waitUntil} from '../../test/test-utils';
import {NumericChangeId} from '../../types/common';
import {assert} from '@open-wc/testing';
import {FlowsAutosubmitProvider} from '../../api/flows';
import {createFlow, createParsedChange} from '../../test/test-data-generators';
import {FlowInfo, FlowStageState} from '../../api/rest-api';

suite('flows-model tests', () => {
  let flowsModel: FlowsModel;
  let changeModel: ChangeModel;
  let pluginsModel: PluginsModel;

  setup(() => {
    changeModel = testResolver(changeModelToken);
    pluginsModel = new PluginsModel();

    flowsModel = new FlowsModel(changeModel, pluginsModel);
  });

  test('flows$ loads flows when enabled', async () => {
    stubRestApi('getIfFlowsIsEnabled').resolves({enabled: true});
    const listFlowsStub = stubRestApi('listFlows').resolves([
      createFlow({uuid: 'flow1', stages: []}),
    ]);

    let flows: FlowInfo[] = [];
    flowsModel.flows$.subscribe(f => (flows = f));

    changeModel.updateStateChange({
      ...createParsedChange(),
      _number: 123 as NumericChangeId,
    });
    await waitUntil(() => flows.length > 0);

    assert.equal(flows.length, 1);
    assert.equal(flows[0].uuid, 'flow1');
    assert.isTrue(listFlowsStub.calledWith(123 as NumericChangeId));
  });

  test('deleteFlow calls API and reloads', async () => {
    stubRestApi('getIfFlowsIsEnabled').resolves({enabled: true});
    stubRestApi('listFlows').resolves([]);
    const deleteFlowStub = stubRestApi('deleteFlow').resolves(new Response());
    const reloadSpy = sinon.spy(flowsModel, 'reload');

    changeModel.updateStateChange({
      ...createParsedChange(),
      _number: 123 as NumericChangeId,
    });
    await waitUntil(() => flowsModel.getState().isEnabled);

    await flowsModel.deleteFlow('flow1');

    assert.isTrue(deleteFlowStub.calledWith(123 as NumericChangeId, 'flow1'));
    assert.isTrue(reloadSpy.called);
  });

  test('createFlow calls API and reloads', async () => {
    stubRestApi('getIfFlowsIsEnabled').resolves({enabled: true});
    stubRestApi('listFlows').resolves([]);
    const createFlowStub = stubRestApi('createFlow').resolves(
      createFlow({uuid: 'new-flow', stages: []})
    );
    const reloadSpy = sinon.spy(flowsModel, 'reload');

    changeModel.updateStateChange({
      ...createParsedChange(),
      _number: 123 as NumericChangeId,
    });
    await waitUntil(() => flowsModel.getState().isEnabled);

    const flowInput = {stage_expressions: []};
    await flowsModel.createFlow(flowInput);

    assert.isTrue(createFlowStub.calledWith(123 as NumericChangeId, flowInput));
    assert.isTrue(reloadSpy.called);
  });

  test('createAutosubmitFlow uses default values', async () => {
    stubRestApi('getIfFlowsIsEnabled').resolves({enabled: true});
    stubRestApi('listFlows').resolves([]);
    const createFlowStub = stubRestApi('createFlow').resolves(
      createFlow({uuid: 'auto-flow', stages: []})
    );

    changeModel.updateStateChange({
      ...createParsedChange(),
      _number: 123 as NumericChangeId,
    });
    await waitUntil(() => flowsModel.getState().isEnabled);

    await flowsModel.createAutosubmitFlow();

    assert.isTrue(createFlowStub.called);
    const args = createFlowStub.firstCall.args;
    assert.equal(args[0], 123 as NumericChangeId);
    assert.deepEqual(args[1], {
      stage_expressions: [
        {
          condition: getSubmitCondition(),
          action: {name: SUBMIT_ACTION_NAME},
        },
      ],
    });
  });

  test('createAutosubmitFlow uses provider values', async () => {
    stubRestApi('getIfFlowsIsEnabled').resolves({enabled: true});
    stubRestApi('listFlows').resolves([]);
    const createFlowStub = stubRestApi('createFlow').resolves(
      createFlow({uuid: 'auto-flow', stages: []})
    );

    const provider: FlowsAutosubmitProvider = {
      isAutosubmitEnabled: () => true,
      getSubmitCondition: () => 'custom condition',
      getSubmitAction: () => {
        return {name: 'custom action'};
      },
    };
    pluginsModel.registerFlowsAutosubmitProvider({
      pluginName: 'test',
      provider,
    });

    changeModel.updateStateChange({
      ...createParsedChange(),
      _number: 123 as NumericChangeId,
    });
    await waitUntil(() => flowsModel.getState().isEnabled);

    await flowsModel.createAutosubmitFlow();

    assert.isTrue(createFlowStub.called);
    const args = createFlowStub.firstCall.args;
    assert.deepEqual(args[1], {
      stage_expressions: [
        {
          condition: getChangePrefix() + ' is custom condition',
          action: {name: 'custom action'},
        },
      ],
    });
  });

  test('hasAutosubmitFlowAlready checks flows', async () => {
    stubRestApi('getIfFlowsIsEnabled').resolves({enabled: true});
    const listFlowsStub = stubRestApi('listFlows').resolves([
      createFlow({
        uuid: 'flow1',
        stages: [
          {
            expression: {
              condition: getSubmitCondition(),
              action: {name: SUBMIT_ACTION_NAME},
            },
            state: FlowStageState.DONE,
          },
        ],
      }),
    ]);

    changeModel.updateStateChange({
      ...createParsedChange(),
      _number: 123 as NumericChangeId,
    });
    await waitUntil(() => flowsModel.getState().flows.length > 0);

    assert.isTrue(flowsModel.hasAutosubmitFlowAlready());

    listFlowsStub.resolves([
      createFlow({
        uuid: 'flow2',
        stages: [
          {
            expression: {
              condition: 'other condition',
              action: {name: 'other action'},
            },
            state: FlowStageState.DONE,
          },
        ],
      }),
    ]);
    flowsModel.reload();
    await waitUntil(() => !flowsModel.hasAutosubmitFlowAlready());
    assert.isFalse(flowsModel.hasAutosubmitFlowAlready());
  });
});
