import 'package:apidash_core/apidash_core.dart';
import 'package:jinja/jinja.dart' as jj;

class RubyNetHttpCodeGen {
  String kTemplateStart = """require "uri"
require "net/http"

url = URI("{{url}}")
https = Net::HTTP.new(url.host, url.port)
{% if check == "https" %}https.use_ssl = true{% endif %}
request = Net::HTTP::{{method}}.new(url)
""";

  String kTemplateHeader = """
{% for key, value in headers %}
request["{{key}}"] = "{{value}}"{% endfor %}
""";

  String kTemplateBody = """

request.body = <<HEREDOC
{{body}}
HEREDOC

""";
  String kMultiPartBodyTemplate = r'''
{% if type == "file" %}"{{name}}", File.open("{{value}}"){% else %}"{{name}}", "{{value}}"{% endif %}
''';
  String kStringRequest = """

response = https.request(request)

puts "Response Code: #{response.code}"
{% if method != "head" %}puts "Response Body: #{response.body}"{% else %}puts "Response Body: #{response.to_hash}"{% endif %}

""";

  String? getCode(HttpRequestModel requestModel) {
    try {
      String result = "";

      var rec = getValidRequestUri(
        requestModel.url,
        requestModel.enabledParams,
      );

      Uri? uri = rec.$1;

      if (uri == null) {
        return "";
      }

      var templateStart = jj.Template(kTemplateStart);
      result += templateStart.render({
        "url": uri.query.isEmpty ? stripUriParams(uri) : uri,
        "method": requestModel.method.name.capitalize(),
        "check": uri.scheme,
      });

      var headers = requestModel.enabledHeadersMap;
      if (!requestModel.hasContentTypeHeader &&
          (requestModel.hasJsonData || requestModel.hasTextData)) {
        headers[kHeaderContentType] = requestModel.bodyContentType.header;
      }

      if (headers.isNotEmpty) {
        var templateHeader = jj.Template(kTemplateHeader);
        result += templateHeader.render({
          "headers": headers,
        });
      }

      if (requestModel.hasTextData || requestModel.hasJsonData) {
        var templateBody = jj.Template(kTemplateBody);
        result += templateBody.render({
          "body": requestModel.body,
        });
      }

      if (requestModel.hasFormData) {
        result += "\n";
        result += "form_data = [";
        var templateMultiPartBody = jj.Template(kMultiPartBodyTemplate);
        int length = requestModel.formDataMapList.length;

        for (var element in requestModel.formDataMapList) {
          result += "[";
          result += templateMultiPartBody.render({
            "name": element["name"],
            "value": element["value"],
            "type": element["type"]
          });
          length -= 1;
          if (length == 0) {
            result += "]";
          } else {
            result += "],";
          }
        }
        result += "]\n";
        result +=
            "request.set_form form_data, '${ContentType.formdata.header}'";
      }

      result += jj.Template(kStringRequest)
          .render({"method": requestModel.method.name});
      return result;
    } catch (e) {
      return null;
    }
  }
}