/**
 * @file ApplyTemplate.h
 * ApplyTemplate class declaration
 *
 * 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.
 */
#ifndef __APPLY_TEMPLATE_H__
#define __APPLY_TEMPLATE_H__

#include <memory>

#include "core/Processor.h"
#include "core/ProcessSession.h"
#include "core/FlowFile.h"
#include "core/Resource.h"

namespace org {
namespace apache {
namespace nifi {
namespace minifi {
namespace processors {

/**
 * Applies a mustache template using incoming attributes as template parameters.
 */
class ApplyTemplate : public core::Processor {
 public:
  /*!
   * Create a new processor
   */
  ApplyTemplate(std::string name, utils::Identifier uuid = utils::Identifier())
      : Processor(name, uuid),
        logger_(logging::LoggerFactory<ApplyTemplate>::getLogger()) {}
  ~ApplyTemplate() {}
  static constexpr char const *ProcessorName = "ApplyTemplate";

  //! Supported Properties
  static core::Property Template;

  //! Supported Relationships
  static core::Relationship Success;

  void onTrigger(const std::shared_ptr<core::ProcessContext> &context,
                 const std::shared_ptr<core::ProcessSession> &session);
  void initialize(void);

  //! Write callback for outputting files generated by applying template to input
  class WriteCallback : public OutputStreamCallback {
   public:
    WriteCallback(const std::string &templateFile, const std::shared_ptr<core::FlowFile> &flow_file);
    int64_t process(std::shared_ptr<io::BaseStream> stream);

   private:
    std::shared_ptr<logging::Logger> logger_;
    std::string template_file_;
    std::shared_ptr<core::FlowFile> flow_file_;
  };

 private:
  std::shared_ptr<logging::Logger> logger_;
};

REGISTER_RESOURCE(ApplyTemplate, "Applies the mustache template specified by the \"Template\" property and writes the output to the flow file content. "
    "FlowFile attributes are used as template parameters.");

} /* namespace processors */
} /* namespace minifi */
} /* namespace nifi */
} /* namespace apache */
} /* namespace org */

#endif
