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

import org.apache.oozie.client.BulkResponse;
import org.apache.oozie.client.BundleJob;
import org.apache.oozie.client.CoordinatorAction;
import org.apache.oozie.client.CoordinatorJob;
import org.apache.oozie.client.JMSConnectionInfo;
import org.apache.oozie.client.OozieClient;
import org.apache.oozie.client.OozieClientException;
import org.apache.oozie.client.WorkflowAction;
import org.apache.oozie.client.WorkflowJob;
import org.apache.oozie.client.rest.RestConstants;
import org.apache.oozie.servlet.V2ValidateServlet;
import org.apache.oozie.util.XConfiguration;
import org.json.simple.JSONObject;

import java.io.IOException;
import java.io.PrintStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Properties;

import static org.apache.oozie.BaseEngine.BaseEngineCallable;
import static org.apache.oozie.BaseEngine.callOrRethrow;
import static org.apache.oozie.BaseEngine.throwNoOp;
import static org.apache.oozie.OozieClientOperationHandler.OozieOperationJob;
import static org.apache.oozie.OozieClientOperationHandler.OozieJobOperationCaller;

abstract class BaseLocalOozieClient extends OozieClient {

    private final BaseEngine engine;

    BaseLocalOozieClient(final BaseEngine engine) {
        Objects.requireNonNull(engine);
        this.engine = engine;
    }

    @Override
    public String getOozieUrl() {
        return "localoozie";
    }

    @Override
    public String getProtocolUrl() throws OozieClientException {
        return "localoozie";
    }

    @Override
    public synchronized void validateWSVersion() throws OozieClientException {
    }

    @Override
    public Properties createConfiguration() {
        final Properties conf = new Properties();
        if (engine != null) {
            conf.setProperty(USER_NAME, engine.getUser());
        }
        conf.setProperty(GROUP_NAME, "users");
        return conf;
    }

    // no-operation
    @Override
    public void setHeader(final String name, final String value) {
    }

    // no-operation
    @Override
    public String getHeader(final String name) {
        return "";
    }

    // no-operation
    @Override
    public void removeHeader(final String name) {
    }

    // no-operation
    @Override
    public Iterator<String> getHeaderNames() {
        return Collections.<String> emptySet().iterator();
    }

    @Override
    public Map<String, String> getHeaders() {
        return Collections.emptyMap();
    }

    @Override
    public String submit(final Properties conf) throws OozieClientException {
        return callOrRethrow(new BaseEngineCallable<String>() {
            @Override
            public String callOrThrow() throws BaseEngineException {
                return engine.submitJob(new XConfiguration(conf), false);
            }
        });
    }

    @Override
    public void start(final String jobId) throws OozieClientException {
        callOrRethrow(new BaseEngineCallable<Void>() {
            @Override
            public Void callOrThrow() throws BaseEngineException {
                engine.start(jobId);
                return null;
            }
        });
    }

    @Override
    public String run(final Properties conf) throws OozieClientException {
        return callOrRethrow(new BaseEngineCallable<String>() {
            @Override
            public String callOrThrow() throws BaseEngineException {
                return engine.submitJob(new XConfiguration(conf), true);
            }
        });
    }

    @Override
    public void reRun(final String jobId, final Properties conf) throws OozieClientException {
        callOrRethrow(new BaseEngineCallable<Void>() {
            @Override
            public Void callOrThrow() throws BaseEngineException {
                engine.reRun(jobId, new XConfiguration(conf));
                return null;
            }
        });
    }

    @Override
    public void suspend(final String jobId) throws OozieClientException {
        callOrRethrow(new BaseEngineCallable<Void>() {
            @Override
            public Void callOrThrow() throws BaseEngineException {
                engine.suspend(jobId);
                return null;
            }
        });
    }

    @Override
    public void resume(final String jobId) throws OozieClientException {
        callOrRethrow(new BaseEngineCallable<Void>() {
            @Override
            public Void callOrThrow() throws BaseEngineException {
                engine.resume(jobId);
                return null;
            }
        });

    }

    @Override
    public void kill(final String jobId) throws OozieClientException {
        callOrRethrow(new BaseEngineCallable<Void>() {
            @Override
            public Void callOrThrow() throws BaseEngineException {
                engine.kill(jobId);
                return null;
            }
        });
    }

    @Override
    public String dryrun(final Properties conf) throws OozieClientException {
        return callOrRethrow(new BaseEngineCallable<String>() {
            @Override
            public String callOrThrow() throws BaseEngineException {
                return engine.dryRunSubmit(new XConfiguration(conf));
            }
        });
    }

    @Override
    public String getStatus(final String jobId) throws OozieClientException {
        return callOrRethrow(new BaseEngineCallable<String>() {
            @Override
            public String callOrThrow() throws BaseEngineException {
                return engine.getJobStatus(jobId);
            }
        });
    }

    @Override
    public String getJobDefinition(final String jobId) throws OozieClientException {
        return callOrRethrow(new BaseEngineCallable<String>() {
            @Override
            public String callOrThrow() throws BaseEngineException {
                return engine.getDefinition(jobId);
            }
        });
    }

    @Override
    public String getJobId(final String externalId) throws OozieClientException {
        return callOrRethrow(new BaseEngineCallable<String>() {
            @Override
            public String callOrThrow() throws BaseEngineException {
                return engine.getJobIdForExternalId(externalId);
            }
        });
    }

    @Override
    public void slaEnableAlert(final String bundleId, final String actions, final String dates, final String coords)
            throws OozieClientException {
        callOrRethrow(new BaseEngineCallable<Void>() {
            @Override
            public Void callOrThrow() throws BaseEngineException {
                engine.enableSLAAlert(bundleId, actions, dates, coords);
                return null;
            }
        });
    }

    @Override
    public void slaEnableAlert(String jobIds, String actions, String dates) throws OozieClientException {
        slaEnableAlert(jobIds, actions, dates, null);
    }

    @Override
    public void slaDisableAlert(final String bundleId, final String actions, final String dates, final String coords)
            throws OozieClientException {
        callOrRethrow(new BaseEngineCallable<Void>() {
            @Override
            public Void callOrThrow() throws BaseEngineException {
                engine.disableSLAAlert(bundleId, actions, dates, coords);
                return null;
            }
        });
    }

    @Override
    public void slaDisableAlert(String jobIds, String actions, String dates) throws OozieClientException {
        slaDisableAlert(jobIds, actions, dates, null);
    }

    @Override
    public void slaChange(final String bundleId, final String actions, final String dates, final String coords,
                          final String newSlaParams)
            throws OozieClientException {
        callOrRethrow(new BaseEngineCallable<Void>() {
            @Override
            public Void callOrThrow() throws BaseEngineException {
                engine.changeSLA(bundleId, actions, dates, coords, newSlaParams);
                return null;
            }
        });
    }

    @Override
    public void slaChange(String jobIds, String actions, String dates, String newSlaParams) throws OozieClientException {
        slaChange(jobIds, actions, dates, null, newSlaParams);
    }

    @Override
    public void slaChange(String bundleId, String actions, String dates, String coords, Map<String, String> newSlaParams)
            throws OozieClientException {
        slaChange(bundleId, actions, dates, coords, mapToString(newSlaParams));
    }

    @Override
    public void change(final String jobId, final String changeValue) throws OozieClientException {
        callOrRethrow(new BaseEngineCallable<Void>() {
            @Override
            public Void callOrThrow() throws BaseEngineException {
                engine.change(jobId, changeValue);
                return null;
            }
        });
    }

    @Override
    public JSONObject bulkModifyJobs(final String actionType, final String filter, final String jobType, final int start,
                                     final int len)
            throws OozieClientException {
        final JSONObject jsonObject;
        switch (actionType) {
            case RestConstants.JOB_ACTION_KILL:
                jsonObject = killJobs(filter, jobType, start, len);
                break;
            case RestConstants.JOB_ACTION_SUSPEND:
                jsonObject = suspendJobs(filter, jobType, start, len);
                break;
            case RestConstants.JOB_ACTION_RESUME:
                jsonObject = resumeJobs(filter, jobType, start, len);
                break;
            default:
                throw new IllegalArgumentException("Invalid actionType passed. actionType: " + actionType);
        }
        return jsonObject;
    }

    @Override
    public JSONObject killJobs(final String filter, final String jobType, final int start, final int len)
            throws OozieClientException {
        OozieClientOperationHandler handler = new OozieClientOperationHandler(engine);
        final OozieOperationJob operation = handler.getOperationHandler(RestConstants.JOB_ACTION_KILL, filter, start, len);


        return callOrRethrow(new BaseEngineCallable<JSONObject>() {
            @Override
            public JSONObject callOrThrow() throws BaseEngineException {
                return new OozieJobOperationCaller().call(jobType, operation);
            }
        });
    }

    @Override
    public JSONObject suspendJobs(final String filter, final String jobType, final int start, final int len)
            throws OozieClientException {
        OozieClientOperationHandler handler = new OozieClientOperationHandler(engine);
        final OozieOperationJob operation = handler.getOperationHandler(RestConstants.JOB_ACTION_SUSPEND, filter, start, len);

        return callOrRethrow(new BaseEngineCallable<JSONObject>() {
            @Override
            public JSONObject callOrThrow() throws BaseEngineException {
                return new OozieJobOperationCaller().call(jobType, operation);
            }
        });
    }

    @Override
    public JSONObject resumeJobs(final String filter, final String jobType, final int start, final int len)
            throws OozieClientException {
        OozieClientOperationHandler handler = new OozieClientOperationHandler(engine);
        final OozieOperationJob operation = handler.getOperationHandler(RestConstants.JOB_ACTION_RESUME, filter, start, len);

        return callOrRethrow(new BaseEngineCallable<JSONObject>() {
            @Override
            public JSONObject callOrThrow() throws BaseEngineException {
                return new OozieJobOperationCaller().call(jobType, operation);
            }
        });
    }


    @Override
    public WorkflowJob getJobInfo(final String jobId) throws OozieClientException {
        return throwNoOp();
    }

    @Override
    public WorkflowJob getJobInfo(final String jobId, final int start, final int len) throws OozieClientException {
        return throwNoOp();
    }

    @Override
    public List<WorkflowJob> getJobsInfo(final String filter, final int start, final int len) throws OozieClientException {
        return throwNoOp();
    }

    @Override
    public List<WorkflowJob> getJobsInfo(final String filter) throws OozieClientException {
        return throwNoOp();
    }

    @Override
    public List<CoordinatorAction> kill(final String jobId, final String rangeType, final String scope)
            throws OozieClientException {
        return throwNoOp();
    }

    @Override
    public List<BulkResponse> getBulkInfo(final String filter, final int start, final int len) throws OozieClientException {
        return throwNoOp();
    }

    @Override
    public String updateCoord(String jobId, Properties conf, String dryrun, String showDiff) throws OozieClientException {
        return throwNoOp();
    }

    @Override
    public String updateCoord(String jobId, String dryrun, String showDiff) throws OozieClientException {
        return throwNoOp();
    }

    @Override
    public WorkflowAction getWorkflowActionInfo(String actionId) throws OozieClientException {
        return throwNoOp();
    }

    @Override
    public BundleJob getBundleJobInfo(String jobId) throws OozieClientException {
        return throwNoOp();
    }

    @Override
    public CoordinatorJob getCoordJobInfo(String jobId) throws OozieClientException {
        return throwNoOp();
    }

    @Override
    public CoordinatorJob getCoordJobInfo(String jobId, String filter, int start, int len) throws OozieClientException {
        return throwNoOp();
    }

    @Override
    public CoordinatorJob getCoordJobInfo(String jobId, String filter, int start, int len, String order)
            throws OozieClientException {
        return throwNoOp();
    }

    @Override
    public List<WorkflowJob> getWfsForCoordAction(String coordActionId) throws OozieClientException {
        return throwNoOp();
    }

    @Override
    public CoordinatorAction getCoordActionInfo(String actionId) throws OozieClientException {
        return throwNoOp();
    }

    @Override
    public List<CoordinatorAction> reRunCoord(String jobId, String rerunType, String scope, boolean refresh, boolean noCleanup)
            throws OozieClientException {
        return throwNoOp();
    }

    @Override
    public List<CoordinatorAction> reRunCoord(String jobId, String rerunType, String scope, boolean refresh,
                                              boolean noCleanup, boolean failed, Properties props) throws OozieClientException {
        return throwNoOp();
    }

    @Override
    public Void reRunBundle(String jobId, String coordScope, String dateScope, boolean refresh, boolean noCleanup)
            throws OozieClientException {
        return throwNoOp();
    }

    @Override
    public List<CoordinatorJob> getCoordJobsInfo(String filter, int start, int len) throws OozieClientException {
        return throwNoOp();
    }

    @Override
    public List<BundleJob> getBundleJobsInfo(String filter, int start, int len) throws OozieClientException {
        return throwNoOp();
    }

    @Override
    protected HttpURLConnection createRetryableConnection(URL url, String method) throws IOException {
        try {
            return throwNoOp();
        } catch (OozieClientException e) {
            throw new IOException(e);
        }
    }

    @Override
    protected HttpURLConnection createConnection(URL url, String method) throws IOException, OozieClientException {
        return throwNoOp();
    }

    @Override
    public List<CoordinatorAction> ignore(String jobId, String scope) throws OozieClientException {
        return throwNoOp();
    }

    @Override
    public JMSConnectionInfo getJMSConnectionInfo() throws OozieClientException {
        return throwNoOp();
    }

    @Override
    public String getJobLog(String jobId) throws OozieClientException {
        return throwNoOp();
    }

    @Override
    public void getJobAuditLog(String jobId, PrintStream ps) throws OozieClientException {
        throwNoOp();
    }

    @Override
    public void getJobLog(String jobId, String logRetrievalType, String logRetrievalScope, String logFilter, PrintStream ps)
            throws OozieClientException {
        throwNoOp();
    }

    @Override
    public void getJobErrorLog(String jobId, PrintStream ps) throws OozieClientException {
        throwNoOp();
    }

    @Override
    public void getJobLog(String jobId, String logRetrievalType, String logRetrievalScope, PrintStream ps)
            throws OozieClientException {
        throwNoOp();
    }

    @Override
    public String getJMSTopicName(String jobId) throws OozieClientException {
        return throwNoOp();
    }

    @Override
    public void getSlaInfo(int start, int len, String filter) throws OozieClientException {
        throwNoOp();
    }

    @Override
    public void setSystemMode(SYSTEM_MODE status) throws OozieClientException {
        throwNoOp();
    }

    @Override
    public SYSTEM_MODE getSystemMode() throws OozieClientException {
        return throwNoOp();
    }

    @Override
    public String updateShareLib() throws OozieClientException {
        return throwNoOp();
    }

    @Override
    public String listShareLib(String sharelibKey) throws OozieClientException {
        return throwNoOp();
    }

    @Override
    public String getServerBuildVersion() throws OozieClientException {
        return throwNoOp();
    }

    @Override
    public String getClientBuildVersion() {
        throw new UnsupportedOperationException("Operation not supported.");
    }

    @Override
    public String validateXML(final String xmlContent) throws OozieClientException {
        final V2ValidateServlet validateServlet = new V2ValidateServlet();

        try {
            validateServlet.validate(xmlContent);
            return V2ValidateServlet.VALID_WORKFLOW_APP;
        }
        catch (final Exception e) {
            throw new OozieClientException("Cannot validate XML.", e);
        }
    }

    @Override
    public void pollJob(String id, int timeout, int interval, boolean verbose) throws OozieClientException {
        throwNoOp();
    }

    @Override
    public List<String> getQueueDump() throws OozieClientException {
        return throwNoOp();
    }

    @Override
    public Map<String, String> getAvailableOozieServers() throws OozieClientException {
        return throwNoOp();
    }

    @Override
    public Map<String, String> getServerConfiguration() throws OozieClientException {
        return throwNoOp();
    }

    @Override
    public Map<String, String> getJavaSystemProperties() throws OozieClientException {
        return throwNoOp();
    }

    @Override
    public Map<String, String> getOSEnv() throws OozieClientException {
        return throwNoOp();
    }

    @Override
    public Metrics getMetrics() throws OozieClientException {
        return throwNoOp();
    }

    @Override
    public Instrumentation getInstrumentation() throws OozieClientException {
        return throwNoOp();
    }
}