/**
 * 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.sqoop.manager.oracle;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.conf.Configuration;

import com.cloudera.sqoop.SqoopOptions;
import com.cloudera.sqoop.manager.OracleUtils;
import com.cloudera.sqoop.testutil.CommonArgs;
import com.cloudera.sqoop.testutil.ExportJobTestCase;
import org.junit.Test;

/**
 * Test free form query import with the MySQL db.
 */
public class OracleCallExportTest extends ExportJobTestCase {

  public static final Log LOG = LogFactory.getLog(
      OracleCallExportTest.class.getName());

  private final String tableName = "ORACLE_CALL_EXPORT_BASE_TABLE";
  private final String procName = "ORACLE_CALL_EXPORT_PROC";

  @Override
  public void setUp() {
    super.setUp();
    createObjects();
  }


  private String[] getArgv(String... extraArgs) {
    ArrayList<String> args = new ArrayList<String>();

    CommonArgs.addHadoopFlags(args);

    args.add("--call");
    args.add(procName);
    args.add("--export-dir");
    args.add(getWarehouseDir());
    args.add("--fields-terminated-by");
    args.add(",");
    args.add("--lines-terminated-by");
    args.add("\\n");
    args.add("--connect");
    args.add(getConnectString());
    args.add("--username");
    args.add(OracleUtils.ORACLE_USER_NAME);
    args.add("--password");
    args.add(OracleUtils.ORACLE_USER_PASS);
    args.add("-m");
    args.add("1");

    for (String arg : extraArgs) {
      args.add(arg);
    }

    return args.toArray(new String[0]);
  }


  private void createObjects() {

    String createTableSql = "CREATE TABLE " + tableName + " ( "
      + "\"ID\"  INT NOT NULL PRIMARY KEY, "
      + "\"MSG\" VARCHAR(24) NOT NULL, "
      + "\"d\" DATE, "
      + "\"f\" FLOAT, "
      + "\"vc\" VARCHAR(32))";

    String createProcSql = "CREATE PROCEDURE " + procName + " ( "
      + "\"ID\" IN INT,"
      + "\"MSG\" IN VARCHAR,"
      + "\"d\" IN DATE,"
      + "\"f\" IN FLOAT) IS BEGIN "
      + "INSERT INTO " + tableName + " "
      + "VALUES(\"ID\","
      + "\"MSG\","
      + "\"d\","
      + "\"f\","
      + "\"MSG\" || '_2'); END;";

    try {
      dropTableIfExists(tableName);
      dropProcedureIfExists(procName);
    } catch (SQLException sqle) {
      throw new AssertionError(sqle.getMessage());
    }
    Connection conn = getConnection();

    try {
      Statement st = conn.createStatement();
      st.executeUpdate(createTableSql);
      LOG.debug("Successfully created table " + tableName);
      st.executeUpdate(createProcSql);
      LOG.debug("Successfully created procedure " + procName);
      st.close();
    } catch (SQLException sqle) {
      throw new AssertionError(sqle.getMessage());
    }
  }

  @Override
  protected Connection getConnection() {
    try {
      return getManager().getConnection();
    } catch (SQLException sqle) {
      throw new AssertionError(sqle.getMessage());
    }
  }

  @Override
  protected boolean useHsqldbTestServer() {
    return false;
  }

  @Override
  protected String getConnectString() {
    return OracleUtils.CONNECT_STRING;
  }

  @Override
  protected SqoopOptions getSqoopOptions(Configuration conf) {
    SqoopOptions opts = new SqoopOptions(conf);
    opts.setUsername(OracleUtils.ORACLE_USER_NAME);
    opts.setPassword(OracleUtils.ORACLE_USER_PASS);
    return opts;
  }

  @Override
  protected String getTableName() {
    return tableName;
  }

  @Override
  protected void dropTableIfExists(String table) throws SQLException {
    Connection conn = getManager().getConnection();
    PreparedStatement statement = conn.prepareStatement(
      "DROP TABLE " + table,
        ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
    try {
      try {
        statement.executeUpdate();
      } catch (SQLException sqle) {
        // Ignore
      }
      conn.commit();
    } finally {
      statement.close();
    }
  }

  protected void dropProcedureIfExists(String proc) throws SQLException {
    Connection conn = getManager().getConnection();
    PreparedStatement statement = conn.prepareStatement(
      "DROP PROCEDURE " + proc,
      ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
    try {
      try {
        statement.executeUpdate();
      } catch (SQLException sqle) {
        // Ignore
      }
      conn.commit();
    } finally {
      statement.close();
    }
  }
  @Test
  public void testExportUsingProcedure() throws IOException, SQLException {
    String[] lines = {
      "0,textfield0,2002-12-29 08:40:00,3300",
      "1,textfield1,2007-06-04 13:15:10,4400",
    };
    new File(getWarehouseDir()).mkdirs();
    File file = new File(getWarehouseDir() + "/part-00000");
    Writer output = new BufferedWriter(new FileWriter(file));
    for (String line : lines) {
      output.write(line);
      output.write("\n");
    }
    output.close();
    runExport(getArgv());
    verifyExport(2, getConnection());
  }
}
