/*
 * 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.flink.table.client.gateway;

import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.table.api.TableSchema;
import org.apache.flink.types.Row;

import java.util.List;
import java.util.Map;

/**
 * A gateway for communicating with Flink and other external systems.
 */
public interface Executor {

	/**
	 * Starts the executor and ensures that its is ready for commands to be executed.
	 */
	void start() throws SqlExecutionException;

	/**
	 * Lists all session properties that are defined by the executor and the session.
	 */
	Map<String, String> getSessionProperties(SessionContext session) throws SqlExecutionException;

	/**
	 * Lists all tables in the default database.
	 */
	List<String> listTables(SessionContext session) throws SqlExecutionException;

	/**
	 * Lists all user-defined functions known to the executor.
	 */
	List<String> listUserDefinedFunctions(SessionContext session) throws SqlExecutionException;

	/**
	 * Parse the namePath, and set the default  database.
	 * If a catalog is not specified, the database is resolved relative to the current catalog.
	 * Note! This method does not support setting default catalog only.
	 */
	void setDefaultDatabase(SessionContext session, String namePath) throws SqlExecutionException;

	/**
	 * Lists all registered catalogs.
	 */
	List<String> listCatalogs(SessionContext session) throws SqlExecutionException;

	/**
	 * Lists all databases in the default catalog.
	 */
	List<String> listDatabases(SessionContext session) throws SqlExecutionException;

	/**
	 * Returns the schema of a table. Throws an exception if the table could not be found. The
	 * schema might contain time attribute types for helping the user during debugging a query.
	 */
	TableSchema getTableSchema(SessionContext session, String name) throws SqlExecutionException;

	/**
	 * Returns a string-based explanation about AST and execution plan of the given statement.
	 */
	String explainStatement(SessionContext session, String statement) throws SqlExecutionException;

	/**
	 * Returns a list of completion hints for the given statement at the given position.
	 */
	List<String> completeStatement(SessionContext session, String statement, int position);

	/**
	 * Submits a Flink SQL query job (detached) and returns the result descriptor.
	 */
	ResultDescriptor executeQuery(SessionContext session, String query) throws SqlExecutionException;

	/**
	 * Asks for the next changelog results (non-blocking).
	 */
	TypedResult<List<Tuple2<Boolean, Row>>> retrieveResultChanges(SessionContext session, String resultId) throws SqlExecutionException;

	/**
	 * Creates an immutable result snapshot of the running Flink job. Throws an exception if no Flink job can be found.
	 * Returns the number of pages.
	 */
	TypedResult<Integer> snapshotResult(SessionContext session, String resultId, int pageSize) throws SqlExecutionException;

	/**
	 * Returns the rows that are part of the current page or throws an exception if the snapshot has been expired.
	 */
	List<Row> retrieveResultPage(String resultId, int page) throws SqlExecutionException;

	/**
	 * Cancels a table program and stops the result retrieval. Blocking until cancellation command has
	 * been sent to cluster.
	 */
	void cancelQuery(SessionContext session, String resultId) throws SqlExecutionException;

	/**
	 * Submits a Flink SQL update statement such as INSERT INTO.
	 *
	 * @param session context in with the statement is executed
	 * @param statement SQL update statement (currently only INSERT INTO is supported)
	 * @return information about the target of the submitted Flink job
	 */
	ProgramTargetDescriptor executeUpdate(SessionContext session, String statement) throws SqlExecutionException;

	/**
	 * Validates the current session. For example, it checks whether all views are still valid.
	 */
	void validateSession(SessionContext session) throws SqlExecutionException;

	/**
	 * Create a table with a DDL.
	 */
	void createTable(SessionContext session, String ddl) throws SqlExecutionException;

	/**
	 * Create a view with a DDL.
	 */
	void createView(SessionContext session, String ddl) throws SqlExecutionException;

	/**
	 * Create a function with a DDL.
	 */
	void createFunction(SessionContext session, String ddl) throws SqlExecutionException;

	/**
	 * Stops the executor.
	 */
	void stop(SessionContext session);
}
