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

#include "ProcessStat.h"
#include <sstream>

namespace org::apache::nifi::minifi::extensions::procfs {

std::optional<ProcessStatData> ProcessStatData::parseProcessStatFile(std::istream& stat_file) {
  std::stringstream stat_stream;
  copy(std::istreambuf_iterator<char>(stat_file),
       std::istreambuf_iterator<char>(),
       std::ostreambuf_iterator<char>(stat_stream));

  ProcessStatData process_stat_data;
  stat_stream >> process_stat_data.pid_;

  std::string stat_stream_string = stat_stream.str();
  size_t comm_start = stat_stream_string.find_first_of('(');
  size_t comm_end = stat_stream_string.find_last_of(')');
  if (comm_start == std::string::npos  || comm_end == std::string::npos)
    return std::nullopt;
  process_stat_data.comm_ = stat_stream_string.substr(comm_start + 1, comm_end-comm_start - 1);
  stat_stream.seekg(gsl::narrow<std::streampos>(comm_end + 2));  // seek to the start of the next field (after the space that follows (<comm>))

  stat_stream >> process_stat_data.state_ >> process_stat_data.ppid_ >> process_stat_data.pgrp_ >> process_stat_data.session_ >> process_stat_data.tty_nr_ >> process_stat_data.tpgid_
              >> process_stat_data.flags_ >> process_stat_data.minflt_ >> process_stat_data.cminflt_ >> process_stat_data.majflt_ >> process_stat_data.cmajflt_ >> process_stat_data.utime_
              >> process_stat_data.stime_ >> process_stat_data.cutime_ >> process_stat_data.cstime_ >> process_stat_data.priority_ >> process_stat_data.nice_ >> process_stat_data.num_threads_
              >> process_stat_data.itrealvalue_ >> process_stat_data.starttime_ >> process_stat_data.vsize_ >> process_stat_data.rss_ >> process_stat_data.rsslim_ >> process_stat_data.startcode_
              >> process_stat_data.endcode_ >> process_stat_data.startstack_ >> process_stat_data.kstkesp_ >> process_stat_data.kstkeip_ >> process_stat_data.signal_ >> process_stat_data.blocked_
              >> process_stat_data.sigignore_ >> process_stat_data.sigcatch_ >> process_stat_data.wchan_ >> process_stat_data.nswap_ >> process_stat_data.cnswap_ >> process_stat_data.exit_signal_
              >> process_stat_data.processor_ >> process_stat_data.rt_priority_ >> process_stat_data.policy_ >> process_stat_data.delayacct_blkio_ticks_ >> process_stat_data.guest_time_
              >> process_stat_data.cguest_time_ >> process_stat_data.start_data_ >> process_stat_data.end_data_ >> process_stat_data.start_brk_ >> process_stat_data.arg_start_
              >> process_stat_data.arg_end_ >> process_stat_data.env_start_ >> process_stat_data.env_end_ >> process_stat_data.exit_code_;
  if (stat_stream.fail())
    return std::nullopt;

  return process_stat_data;
}
}  // namespace org::apache::nifi::minifi::extensions::procfs
