interface IJBFundingCycleStore {
  event Configure(
    uint256 indexed configuration,
    uint256 indexed projectId,
    JBFundingCycleData data,
    uint256 metadata,
    uint256 mustStartAtOrAfter,
    address caller
  );
  event Init(uint256 indexed configuration, uint256 indexed projectId, uint256 indexed basedOn);
  function latestConfigurationOf(uint256 _projectId) external view returns (uint256);
  function get(uint256 _projectId, uint256 _configuration)
    external
    view
    returns (JBFundingCycle memory);
  function latestConfiguredOf(uint256 _projectId)
    external
    view
    returns (JBFundingCycle memory fundingCycle, JBBallotState ballotState);
  function queuedOf(uint256 _projectId) external view returns (JBFundingCycle memory fundingCycle);
  function currentOf(uint256 _projectId) external view returns (JBFundingCycle memory fundingCycle);
  function currentBallotStateOf(uint256 _projectId) external view returns (JBBallotState);
  function configureFor(
    uint256 _projectId,
    JBFundingCycleData calldata _data,
    uint256 _metadata,
    uint256 _mustStartAtOrAfter
  ) external returns (JBFundingCycle memory fundingCycle);
}