import App from '../../models/app';
import Step from '../../models/step';
import Context from '../../types/express/context';

type Params = {
  input: {
    triggerAppKey: string;
    connectionId: string;
  };
};

const createFlow = async (
  _parent: unknown,
  params: Params,
  context: Context
) => {
  context.currentUser.can('create', 'Flow');

  const connectionId = params?.input?.connectionId;
  const appKey = params?.input?.triggerAppKey;

  if (appKey) {
    await App.findOneByKey(appKey);
  }

  const flow = await context.currentUser.$relatedQuery('flows').insert({
    name: 'Name your flow',
  });

  if (connectionId) {
    const hasConnection = await context.currentUser
      .$relatedQuery('connections')
      .findById(connectionId);

    if (!hasConnection) {
      throw new Error('The connection does not exist!');
    }
  }

  await Step.query().insert({
    flowId: flow.id,
    type: 'trigger',
    position: 1,
    appKey,
    connectionId,
  });

  await Step.query().insert({
    flowId: flow.id,
    type: 'action',
    position: 2,
  });

  return flow;
};

export default createFlow;
