/*
 * 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.ambari.server.api.rest;

import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.Context;
import jakarta.ws.rs.core.HttpHeaders;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.UriInfo;

import org.apache.ambari.annotations.ApiIgnore;
import org.apache.ambari.server.KdcServerConnectionVerification;
import org.apache.ambari.server.StaticallyInject;

import com.google.inject.Inject;

/**
 * Service responsible for kerberos related resource requests.
 */
@StaticallyInject
@Path("/kdc_check/")
public class KdcServerReachabilityCheck {
  private static final String REACHABLE = "REACHABLE";
  private static final String UNREACHABLE = "UNREACHABLE";

  @Inject
  private static KdcServerConnectionVerification kdcConnectionChecker;

  /**
   * Handles: GET /kdc_check/{hosts}
   * Checks the reachability of the given KDC server(s). If a list of hosts is sent, checks will be
   * performs until the first one succeeds, else a failure will be returned.
   *
   * @param headers      http headers
   * @param ui           uri info
   * @param hosts A comma-delimited list of host names to check for a KDC server.
   *                     Each entry may contain port separate by a colon (:)
   * @return status whether KDC server is reachable or not
   */
  @GET @ApiIgnore // until documented
  @Path("{hosts}")
  @Produces(MediaType.TEXT_PLAIN)
  public String plainTextCheck(@Context HttpHeaders headers, @Context UriInfo ui,
                               @PathParam("hosts") String hosts) {
    String status = UNREACHABLE;
    if(hosts != null) {
      String[] kdcHosts = hosts.split(",");
      for(String kdcHost : kdcHosts) {
        kdcHost = kdcHost.trim();

        if (!kdcHost.isEmpty()) {
          if (kdcConnectionChecker.isKdcReachable(kdcHost)) {
            status = REACHABLE;

            // We found a success, so break since we only care about at least one successful connection
            break;
          }
        }
      }
    }

    return status;
  }

  // This method is called if XML is request
  @GET @ApiIgnore // until documented
  @Path("{hostname}")
  @Produces(MediaType.TEXT_XML)
  public String xmlCheck(@Context HttpHeaders headers, @Context UriInfo ui,
      @PathParam("hostname") String kdcServerHostName) {
    String status = UNREACHABLE;
    if (kdcConnectionChecker.isKdcReachable(kdcServerHostName)) {
      status = REACHABLE;
    } 
    return new StringBuilder()
    .append("<?xml version=\"1.0\"?>")
    .append("<status>").append(status).append("</status>")
    .toString();
  }

  // This method is called if HTML is request
  @GET @ApiIgnore // until documented
  @Path("{hostname}")
  @Produces(MediaType.TEXT_HTML)
  public String  htmlCheck(@Context HttpHeaders headers, @Context UriInfo ui,
      @PathParam("hostname") String kdcServerHostName) {
    String status = UNREACHABLE;
    if (kdcConnectionChecker.isKdcReachable(kdcServerHostName)) {
      status = REACHABLE;
    } 
    return new StringBuilder()
    .append("<html>\n")
    .append("<title>").append("Status").append("</title>\n")
    .append("<body><h1>").append(status).append("</body></h1>\n")
    .append("</html> ")
    .toString();
  }

}
