// GenTextile - A composite textile generator
// Copyright (C) 2011-2026 Eric Bechet, Frederic Duboeuf
//
// See the LICENSE file for license information and contributions.
// Please report all bugs and problems to <bechet@cadxfem.org> or <duboeuf@outlook.com>.


#include "genDataT.h"
#include <iostream>
#include <iomanip>
#include <fstream>
#include <cassert>
#include <boost/algorithm/string.hpp>
#include <fullMatrix.h>


void genDataT::readInputFile(const std::string &fileName)
{
  std::ifstream ff;
  ff.open(fileName.c_str());
  while ( !ff.eof()  )
  {
    std::string token;
    NextToken (ff,token);
    if (token=="Textile")
    {
      genTextile* T2 = new genTextile();
      ff >> *T2;
      T = T2;
    }
    else if ((token.find_first_of("/#.;,\\+-*[]")==std::string::npos))
    {
      std::string tenstype;
      NextToken (ff,tenstype);
      if (tenstype=="Integer")
      {
        readScalar(ff,User.Integers[token]);
        User.AllData[token]=genDomain::Integer;
      }
      else if (tenstype=="Scalar")
      {
        readScalar(ff,User.Scalars[token]);
        User.AllData[token]=genDomain::Scalar;
      }
      else if (tenstype=="Vector")
      {
        readVector(ff,User.Vectors[token]);
        User.AllData[token]=genDomain::Vector;
      }
      else if (tenstype=="Matrix")
      {
        readMatrix(ff,User.Tensors[token]);
        User.AllData[token]=genDomain::Tensor;
      }
    }
  }
  ff.close();
}

void genDataT::dumpContent(std::ostream &os)
{
  os << *T << std::endl;
  for (std::map<std::string,genDomain::tenstype>::const_iterator it=User.AllData.begin();it!=User.AllData.end();++it)
  {
    if (it->second==genDomain::Integer)
      os << it->first << " Integer " << User.Integers.find(it->first)->second << std::endl;
    else if (it->second==genDomain::Scalar)
      os << it->first << " Scalar " << User.Scalars.find(it->first)->second << std::endl;
    else if (it->second==genDomain::Vector)
      os << it->first << " Vector " << "XXXXXXXXX"/*User.Vectors.find(it->first)->second */<< std::endl;
    else if (it->second==genDomain::Tensor)
      os << it->first << " Matrix " << "XXXXXXXXX"/*User.Tensors.find(it->first)->second */<< std::endl;
  }
//   os << "SolverType " << solvertype << std::endl;
}

std::istream & operator>>(std::istream &is, genTextile &obj)
{
  NextToken(is,obj.name);
  std::string token;
  NextToken(is,token);
  if (token=="Data")
  {
    std::string name;
    NextToken(is,name);
    while (name!="EndData")
    {
      std::string tenstype;
      NextToken(is,tenstype);
      if (tenstype=="Integer")
      {
        readScalar(is,obj.Integers[name]);
        obj.AllData[name]=genTextile::Integer;
      }
      else if (tenstype=="Scalar")
      {
        readScalar(is,obj.Scalars[name]);
        obj.AllData[name]=genTextile::Scalar;
      }
      else if (tenstype=="Vector")
      {
        readVector(is,obj.Vectors[name]);
        obj.AllData[name]=genTextile::Vector;
      }
      else if (tenstype=="Matrix")
      {
        readMatrix(is,obj.Tensors[name]);
        obj.AllData[name]=genTextile::Tensor;
      }
      NextToken(is,name);
    }
  }
  return is;
}

std::ostream & operator<<(std::ostream &os, const genTextile &obj)
{
  os << "Textile " << obj.name;
  return os;
}
