// ignore_for_file: public_member_api_docs, sort_constructors_first
// Copyright (C) 2022 WYATT GROUP
// Please see the AUTHORS file for details.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.

import 'package:wyatt_http_client/src/middleware_client.dart';
import 'package:wyatt_http_client/src/models/middleware_request.dart';
import 'package:wyatt_http_client/src/models/middleware_response.dart';
import 'package:wyatt_http_client/src/pipeline.dart';

class MiddlewareContext {
  Pipeline pipeline;
  MiddlewareClient client;
  MiddlewareRequest? originalRequest;
  MiddlewareRequest? lastRequest;
  MiddlewareResponse? originalResponse;
  MiddlewareResponse? lastResponse;

  MiddlewareContext({
    required this.pipeline,
    required this.client,
    this.originalRequest,
    this.lastRequest,
    this.originalResponse,
    this.lastResponse,
  });

  MiddlewareContext copyWith({
    Pipeline? pipeline,
    MiddlewareClient? client,
    MiddlewareRequest? originalRequest,
    MiddlewareRequest? lastRequest,
    MiddlewareResponse? originalResponse,
    MiddlewareResponse? lastResponse,
  }) => MiddlewareContext(
      pipeline: pipeline ?? this.pipeline,
      client: client ?? this.client,
      originalRequest: originalRequest ?? this.originalRequest,
      lastRequest: lastRequest ?? this.lastRequest,
      originalResponse: originalResponse ?? this.originalResponse,
      lastResponse: lastResponse ?? this.lastResponse,
    );

  @override
  String toString() => 'MiddlewareContext(pipeline: $pipeline, client: $client, originalRequest: $originalRequest, lastRequest: $lastRequest, originalResponse: $originalResponse, lastResponse: $lastResponse)';
}
