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

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hive.metastore.api.Constants;
import org.apache.hadoop.hive.metastore.api.Partition;
import org.apache.hadoop.mapreduce.JobContext;
import org.apache.hadoop.tools.HadoopArchives;
import org.apache.hadoop.util.ToolRunner;
import org.apache.hcatalog.common.HCatConstants;
import org.apache.hcatalog.common.HCatException;

public class HarOutputCommitterPostProcessor {
  
  boolean isEnabled = false;
  
  public boolean isEnabled() {
    return isEnabled;
  }

  public void setEnabled(boolean enabled) {
    this.isEnabled = enabled;
  }


  public void exec(JobContext context, Partition partition, Path partPath) throws IOException {
//    LOG.info("Archiving partition ["+partPath.toString()+"]");
    makeHar(context,partPath.toUri().toString(),harFile(partPath));
    partition.getParameters().put(Constants.IS_ARCHIVED, "true");
  }
  
  public String harFile(Path ptnPath) throws IOException{
    String harFile = ptnPath.toString().replaceFirst("/+$", "") + ".har";
//    LOG.info("har file : " + harFile);
    return harFile;
  }

  public String getParentFSPath(Path ptnPath) throws IOException {
    return ptnPath.toUri().getPath().replaceFirst("/+$", "");
  }

  public String getProcessedLocation(Path ptnPath) throws IOException {
    String harLocn = ("har://" + ptnPath.toUri().getPath()).replaceFirst("/+$", "") + ".har" + Path.SEPARATOR;
//    LOG.info("har location : " + harLocn);
    return harLocn;
  }
  

  /**
   * Creates a har file from the contents of a given directory, using that as root.
   * @param dir Directory to archive
   * @param harFile The HAR file to create
   */
  public static void makeHar(JobContext context, String dir, String harFile) throws IOException{
//    Configuration conf = context.getConfiguration();
//    Credentials creds = context.getCredentials();
    
//    HCatUtil.logAllTokens(LOG,context);
    
    int lastSep = harFile.lastIndexOf(Path.SEPARATOR_CHAR);
    Path archivePath = new Path(harFile.substring(0,lastSep));
    final String[] args = {
        "-archiveName",
        harFile.substring(lastSep+1, harFile.length()),
        "-p",
        dir,
        "*",
        archivePath.toString()
    };
//    for (String arg : args){
//      LOG.info("Args to har : "+ arg);
//    }
    try {
      Configuration newConf = new Configuration();
      FileSystem fs = archivePath.getFileSystem(newConf);
      
      String hadoopTokenFileLocationEnvSetting = System.getenv(HCatConstants.SYSENV_HADOOP_TOKEN_FILE_LOCATION);
      if ((hadoopTokenFileLocationEnvSetting != null) && (!hadoopTokenFileLocationEnvSetting.isEmpty())){
        newConf.set(HCatConstants.CONF_MAPREDUCE_JOB_CREDENTIALS_BINARY, hadoopTokenFileLocationEnvSetting);
//      LOG.info("System.getenv(\"HADOOP_TOKEN_FILE_LOCATION\") =["+  System.getenv("HADOOP_TOKEN_FILE_LOCATION")+"]");
      }
//      for (FileStatus ds : fs.globStatus(new Path(dir, "*"))){
//        LOG.info("src : "+ds.getPath().toUri().toString());
//      }

      final HadoopArchives har = new HadoopArchives(newConf);
      int rc = ToolRunner.run(har, args);
      if (rc!= 0){
        throw new Exception("Har returned error code "+rc);
      }

//      for (FileStatus hs : fs.globStatus(new Path(harFile, "*"))){
//        LOG.info("dest : "+hs.getPath().toUri().toString());
//      }
//      doHarCheck(fs,harFile);
//      LOG.info("Nuking " + dir);
      fs.delete(new Path(dir), true);
    } catch (Exception e){
      throw new HCatException("Error creating Har ["+harFile+"] from ["+dir+"]", e);
    }
  }

}
