import { Construct } from 'constructs';
import { Duration, Stack } from '@aws-cdk/core';
import * as codepipeline from '@aws-cdk/aws-codepipeline';

interface MyActionProps {
  variablesNamespace?: string;
  actionName: string;
}

class MyAction extends codepipeline.Action {
  public variables: { [key: string]: string };
  protected readonly providedActionProperties: codepipeline.ActionProperties; 

  constructor(props: MyActionProps) {
    super();
    this.providedActionProperties = {
      ...props,
      category: codepipeline.ActionCategory.SOURCE,
      provider: 'Fake',
      artifactBounds: { minInputs: 0, maxInputs: 0, minOutputs: 1, maxOutputs: 4 },
    };
    this.variables = { 'myVariable': 'var' };
  }

  public bound(_scope: Construct, _stage: codepipeline.IStage, _options: codepipeline.ActionBindOptions):
  codepipeline.ActionConfig {
    return {};
  }
}

interface OtherActionProps {
  config: string;
  actionName: string;
}

class OtherAction extends codepipeline.Action {
  protected readonly providedActionProperties: codepipeline.ActionProperties; 

  constructor(props: OtherActionProps) {
    super();
    this.providedActionProperties = {
      ...props,
      category: codepipeline.ActionCategory.SOURCE,
      provider: 'Fake',
      artifactBounds: { minInputs: 0, maxInputs: 0, minOutputs: 1, maxOutputs: 4 },
    };
  }

  public bound(_scope: Construct, _stage: codepipeline.IStage, _options: codepipeline.ActionBindOptions):
  codepipeline.ActionConfig {
    return {};
  }
}

class Context extends Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    /// here
  }
}
