// Copyright 2025 International Digital Economy Academy
//
// Licensed 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.

///|
fn RequestMethod::write_show(self : RequestMethod, logger : &Logger) -> Unit {
  match self {
    Get => logger <+ "Get"
    Head => logger <+ "Head"
    Post => logger <+ "Post"
    Put => logger <+ "Put"
    Delete => logger <+ "Delete"
    Connect => logger <+ "Connect"
    Options => logger <+ "Options"
    Trace => logger <+ "Trace"
    Patch => logger <+ "Patch"
  }
}

///|
fn Protocol::write_show(self : Protocol, logger : &Logger) -> Unit {
  match self {
    Http => logger <+ "Http"
    Https => logger <+ "Https"
  }
}

///|
fn write_headers_show(headers : Map[String, String], logger : &Logger) -> Unit {
  logger <+ "{"
  let mut first = true
  for key, value in headers {
    if first {
      first = false
    } else {
      logger <+ ", "
    }
    logger <+ "\{key.escape()}: \{value.escape()}"
  }
  logger <+ "}"
}

///|
fn Request::write_show(self : Request, logger : &Logger) -> Unit {
  logger <+ "{meth: "
  self.meth.write_show(logger)
  logger <+ ", path: \{self.path.escape()}, headers: "
  write_headers_show(self.headers, logger)
  logger <+ "}"
}

///|
fn Response::write_show(self : Response, logger : &Logger) -> Unit {
  logger <+ "{code: \{self.code}, reason: \{self.reason.escape()}, headers: "
  write_headers_show(self.headers, logger)
  logger <+ "}"
}

///|
#deprecated("`Show` implementation for this type is deprecated, use `Debug` related API, or use `@debug.to_string` instead.")
pub impl Show for RequestMethod

///|
pub impl Show for RequestMethod with fn output(self, logger) {
  self.write_show(logger)
}

///|
#deprecated("`Show` implementation for this type is deprecated, use `Debug` related API, or use `@debug.to_string` instead.")
pub impl Show for Request

///|
pub impl Show for Request with fn output(self, logger) {
  self.write_show(logger)
}

///|
#deprecated("`Show` implementation for this type is deprecated, use `Debug` related API, or use `@debug.to_string` instead.")
pub impl Show for Response

///|
pub impl Show for Response with fn output(self, logger) {
  self.write_show(logger)
}

///|
#deprecated("`Show` implementation for this type is deprecated, use `Debug` related API, or use `@debug.to_string` instead.")
pub impl Show for Protocol

///|
pub impl Show for Protocol with fn output(self, logger) {
  self.write_show(logger)
}

///|
#deprecated("`Show` implementation for this type is deprecated, use `Debug` related API, or use `@debug.to_string` instead.")
pub impl Show for URIParseError

///|
pub impl Show for URIParseError with fn output(self, logger) {
  match self {
    InvalidFormat => logger <+ "InvalidFormat"
    UnsupportedProtocol(protocol) =>
      logger <+ "UnsupportedProtocol(\{Repr(protocol)})"
  }
}

///|
#cfg(any(target="native", target="wasm"))
#deprecated("`Show` implementation for this type is deprecated, use `Debug` related API, or use `@debug.to_string` instead.")
pub impl Show for ProxyError

///|
#cfg(any(target="native", target="wasm"))
pub impl Show for ProxyError with fn output(self, logger) {
  match self {
    ProxyError(response) => {
      logger <+ "ProxyError("
      response.write_show(logger)
      logger <+ ")"
    }
  }
}

///|
#cfg(any(target="native", target="wasm"))
#deprecated("`Show` implementation for this type is deprecated, use `Debug` related API, or use `@debug.to_string` instead.")
pub impl Show for HttpProtocolError

///|
#cfg(any(target="native", target="wasm"))
pub impl Show for HttpProtocolError with fn output(self, logger) {
  match self {
    BadRequest => logger <+ "BadRequest"
    HttpVersionNotSupported(version) =>
      logger <+ "HttpVersionNotSupported(\{Repr(version)})"
    NotImplemented => logger <+ "NotImplemented"
  }
}