/*
 * 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.
 */

package org.apache.solr.client.solrj.request;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.util.concurrent.atomic.AtomicLong;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.io.IOUtils;
import org.apache.solr.client.solrj.ResponseParser;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrRequest;
import org.apache.solr.client.solrj.response.V2Response;
import org.apache.solr.common.MapWriter;
import org.apache.solr.common.params.SolrParams;
import org.apache.solr.common.util.JavaBinCodec;
import org.apache.solr.common.util.Utils;

import static org.apache.solr.common.params.CommonParams.JAVABIN_MIME;
import static org.apache.solr.common.params.CommonParams.JSON_MIME;

public class V2Request extends SolrRequest<V2Response> implements MapWriter {
  //only for debugging purposes
  public static final ThreadLocal<AtomicLong> v2Calls = new ThreadLocal<>();
  static final Pattern COLL_REQ_PATTERN = Pattern.compile("/(c|collections)/([^/])+/(?!shards)");
  private Object payload;
  private SolrParams solrParams;
  public final boolean useBinary;
  private String collection;
  private String mimeType;
  private boolean forceV2 = false;
  private boolean isPerCollectionRequest = false;
  private ResponseParser parser;

  private V2Request(METHOD m, String resource, boolean useBinary) {
    super(m, resource);
    Matcher matcher = COLL_REQ_PATTERN.matcher(getPath());
    if (matcher.find()) {
      this.collection = matcher.group(2);
      isPerCollectionRequest = true;
    }
    this.useBinary = useBinary;

  }

  public boolean isForceV2() {
    return forceV2;
  }

  @Override
  public SolrParams getParams() {
    return solrParams;
  }

  @Override
  public RequestWriter.ContentWriter getContentWriter(String s) {
    if (v2Calls.get() != null) v2Calls.get().incrementAndGet();
    if (payload == null) return null;
    if (payload instanceof String) {
      return new RequestWriter.StringPayloadContentWriter((String) payload, JSON_MIME);
    }
    return new RequestWriter.ContentWriter() {
      @Override
      public void write(OutputStream os) throws IOException {
        if (payload instanceof ByteBuffer) {
          ByteBuffer b = (ByteBuffer) payload;
          os.write(b.array(), b.arrayOffset(), b.limit());
          return;
        }
        if (payload instanceof InputStream) {
          IOUtils.copy((InputStream) payload, os);
          return;
        }
        if (useBinary) {
          new JavaBinCodec().marshal(payload, os);
        } else {
          Utils.writeJson(payload, os, false);
        }
      }

      @Override
      public String getContentType() {
        if (mimeType != null) return mimeType;
        return useBinary ? JAVABIN_MIME : JSON_MIME;
      }
    };
  }

  public boolean isPerCollectionRequest() {
    return isPerCollectionRequest;
  }

  @Override
  public String getCollection() {
    return collection;
  }

  @Override
  protected V2Response createResponse(SolrClient client) {
    return new V2Response();
  }

  @Override
  public void writeMap(EntryWriter ew) throws IOException {
    ew.put("method", getMethod().toString());
    ew.put("path", getPath());
    ew.putIfNotNull("params", solrParams);
    ew.putIfNotNull("command", payload);
  }

  @Override
  public ResponseParser getResponseParser() {
    if (parser != null) return parser;
    return super.getResponseParser();
  }

  @Override
  public String getRequestType() {
    return SolrRequestType.ADMIN.toString();
  }

  public static class Builder {
    private String resource;
    private METHOD method = METHOD.GET;
    private Object payload;
    private SolrParams params;
    private boolean useBinary = false;

    private boolean forceV2EndPoint = false;
    private ResponseParser parser;
    private String mimeType;

    /**
     * Create a Builder object based on the provided resource.
     * The default method is GET.
     *
     * @param resource resource of the request for example "/collections" or "/cores/core-name"
     */
    public Builder(String resource) {
      if (!resource.startsWith("/")) resource = "/" + resource;
      this.resource = resource;
    }

    public Builder withMethod(METHOD m) {
      this.method = m;
      return this;
    }

    /**
     * Only for testing. It's always true otherwise
     */
    public Builder forceV2(boolean flag) {
      forceV2EndPoint = flag;
      return this;
    }

    /**
     * Set payload for request.
     *
     * @param payload as UTF-8 String
     * @return builder object
     */
    public Builder withPayload(String payload) {
      if (payload != null) {
        this.payload = payload;
      }
      return this;
    }

    public Builder withPayload(Object payload) {
      this.payload = payload;
      return this;
    }


    public Builder withParams(SolrParams params) {
      this.params = params;
      return this;
    }

    public Builder useBinary(boolean flag) {
      this.useBinary = flag;
      return this;
    }

    public Builder withResponseParser(ResponseParser parser) {
      this.parser = parser;
      return this;
    }

    public Builder withMimeType(String mimeType) {
      this.mimeType = mimeType;
      return this;

    }

    public V2Request build() {
      V2Request v2Request = new V2Request(method, resource, useBinary);
      v2Request.solrParams = params;
      v2Request.payload = payload;
      v2Request.forceV2 = forceV2EndPoint;
      v2Request.mimeType = mimeType;
      v2Request.parser = parser;
      return v2Request;
    }
  }
}
