/** @file
 *
 *  A brief file description
 *
 *  @section license License
 *
 *  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.
 */

#pragma once

#include "QUICTypes.h"

class QUICConnectionInfoProvider;
class QUICPathValidator;

class QUICPathManager
{
public:
  QUICPathManager(const QUICConnectionInfoProvider &info, QUICPathValidator &path_validator)
    : _cinfo(info), _path_validator(path_validator)
  {
  }

  const QUICPath &get_current_path();
  const QUICPath &get_verified_path();
  void open_new_path(const QUICPath &path, ink_hrtime timeout_in);
  void set_trusted_path(const QUICPath &path);

private:
  const QUICConnectionInfoProvider &_cinfo;
  QUICPathValidator &_path_validator;

  ink_hrtime _verify_timeout_at = 0;
  QUICPath _current_path        = {{}, {}};
  QUICPath _previous_path       = {{}, {}};

  void _check_verify_timeout();
};
