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

import org.apache.hadoop.mapred.Counters;
import org.apache.hadoop.mapred.InputSplit;
import org.apache.hadoop.mapred.Reporter;
import org.apache.hadoop.mapreduce.StatusReporter;
import org.apache.hadoop.mapreduce.TaskAttemptContext;
import org.apache.hadoop.mapreduce.TaskInputOutputContext;

class ProgressReporter extends StatusReporter implements Reporter {

  private TaskInputOutputContext context = null;
  private TaskAttemptContext taskAttemptContext = null;

  public ProgressReporter(TaskAttemptContext context) {
    if (context instanceof TaskInputOutputContext) {
      this.context = (TaskInputOutputContext) context;
    } else {
      taskAttemptContext = context;
    }
  }

  @Override
  public void setStatus(String status) {
    if (context != null) {
      context.setStatus(status);
    }
  }

  @Override
  public Counters.Counter getCounter(Enum<?> name) {
    return (context != null) ? (Counters.Counter) context.getCounter(name) : null;
  }

  @Override
  public Counters.Counter getCounter(String group, String name) {
    return (context != null) ? (Counters.Counter) context.getCounter(group, name) : null;
  }

  @Override
  public void incrCounter(Enum<?> key, long amount) {
    if (context != null) {
      context.getCounter(key).increment(amount);
    }
  }

  @Override
  public void incrCounter(String group, String counter, long amount) {
    if (context != null) {
      context.getCounter(group, counter).increment(amount);
    }
  }

  @Override
  public InputSplit getInputSplit() throws UnsupportedOperationException {
    return null;
  }

  public float getProgress() {
      /* Required to build against 0.23 Reporter and StatusReporter. */
      /* TODO: determine the progress. */
      return 0.0f;
  }

  @Override
  public void progress() {
    if (context != null) {
      context.progress();
    } else {
      taskAttemptContext.progress();
    }
  }
}
