// 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 'dart:convert';

/// {@template unfreezed_request}
/// A class that represents an unfreezed request.
/// It is used to unfreeze a Request object, and allows you to
/// modify the request before sending it.
/// {@endtemplate}
class UnfreezedRequest {
  /// {@macro unfreezed_request}
  const UnfreezedRequest({
    required this.method,
    required this.url,
    this.headers,
    this.body,
    this.encoding,
  });

  /// The request method.
  final String method;

  /// The request url.
  final Uri url;

  /// The request headers.
  final Map<String, String>? headers;

  /// The request body.
  final Object? body;

  /// The request encoding.
  final Encoding? encoding;

  /// Copies this request and returns a new request with the given [method],
  /// [url], [headers], [body] and [encoding].
  UnfreezedRequest copyWith({
    String? method,
    Uri? url,
    Map<String, String>? headers,
    Object? body,
    Encoding? encoding,
  }) =>
      UnfreezedRequest(
        method: method ?? this.method,
        url: url ?? this.url,
        headers: headers ?? this.headers,
        body: body ?? this.body,
        encoding: encoding ?? this.encoding,
      );

  @override
  String toString() => 'UnfreezedRequest(method: $method, url: $url, headers: '
      '$headers, body: $body, encoding: $encoding)';
}
