// RUN: %clang++ -std=c++11 -fno-exceptions -ffast-math -O0 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -S
// RUN: %clang++ -std=c++11 -fno-exceptions -ffast-math -O1 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -S
// RUN: %clang++ -std=c++11 -fno-exceptions -ffast-math -O2 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -S
// RUN: %clang++ -std=c++11 -fno-exceptions -ffast-math -O3 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -S
// RUN: %clang++ -std=c++11 -fno-exceptions -ffast-math -O0 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -enzyme-inline=1 -S
// RUN: %clang++ -std=c++11 -fno-exceptions -ffast-math -O1 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -enzyme-inline=1 -S -enzyme-loose-types
// RUN: %clang++ -std=c++11 -fno-exceptions -ffast-math -O2 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -enzyme-inline=1 -S
// RUN: %clang++ -std=c++11 -fno-exceptions -ffast-math -O3 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -enzyme-inline=1 -S

#include "../test_utils.h"
#include <fstream>
#include <iostream>
#include <sstream>
#include <utility>

extern double __enzyme_autodiff(void *, double);

double fn(double vec) {
  std::string s("many more tests");
  std::ifstream ifs(s.c_str(), std::ios_base::binary | std::ios_base::in);
  std::ifstream ifs1(s.c_str(), std::ios_base::binary | std::ios_base::out);
  std::ifstream ifs2(s.c_str(), std::ios_base::binary | std::ios_base::app);
  std::ifstream ifs3(s.c_str(), std::ios_base::binary | std::ios_base::trunc);
  std::ifstream ifs4(s.c_str(), std::ios_base::binary | std::ios_base::binary);
  std::ifstream ifs5(s.c_str(), std::ios_base::binary | std::ios_base::ate);
  if (ifs) {
    char buffer[20];
    if (!ifs.read(buffer, 20)) {
      // Handle error
    }
    std::ifstream &ignore(int n = 1, int delim = EOF);
  }
  std::filebuf fb;
  fb.open("%S/Inputs/input.txt", std::ios::out);
  std::ostream os(&fb);
  os << "Test sentence\n";
  vec *= 2;
  fb.close();

  std::ifstream is;
  std::filebuf *fb2 = is.rdbuf();

  // construct output string stream (buffer) - need <sstream> header
  std::ostringstream sout;

  // Write into string buffer
  sout << "apple" << std::endl;
  sout << "orange" << std::endl;
  sout << "banana" << std::endl;

  // Get contents
  std::cout << sout.str() << std::endl;

  std::string filename = "test.bin";

  // Write to File
  std::ofstream fout(filename.c_str(), std::ios::out | std::ios::binary);
  if (!fout.is_open()) {
    std::cerr << "error: open file for output failed!" << std::endl;
    abort();
  }
  int i = 1234;
  double d = 12.34;
  fout.write((char *)&i, sizeof(int));
  fout.write((char *)&d, sizeof(double));
  fout.close();

  // Read from file
  std::ifstream fin(filename.c_str(), std::ios::in | std::ios::binary);
  if (!fin.is_open()) {
    std::cerr << "error: open file for input failed!" << std::endl;
    abort();
  }
  int i_in;
  double d_in;
  fin.read((char *)&i_in, sizeof(int));
  std::cout << i_in << std::endl;
  fin.read((char *)&d_in, sizeof(double));
  std::cout << d_in << std::endl;
  fin.close();

  char mybuffer[512];
  std::filebuf *optr = new std::filebuf();
  optr->pubsetbuf(mybuffer, 512);
  const char sentence[] = "Sample sentence";
  auto ptr =
      optr->open("bd.bin", std::ios::binary | std::ios::trunc | std::ios::out);
  if (ptr) {
    float fx = 13;
    auto n = optr->sputn(sentence, sizeof(sentence) - 1);
    n += optr->sputn(reinterpret_cast<const char *>(&fx), sizeof(fx));
    optr->pubsync();
  }
  optr->close();
  if (optr) {
    delete optr;
  }

  return vec * vec;
}

int main() {
    double x = 2.1;
    double dsq = __enzyme_autodiff((void*)fn, x);

    APPROX_EQ(dsq, 2.1 * 2 * 2 * x, 1e-7);
}
