//=========================================================================
//  Copyright (c) Kitware, Inc.
//  All rights reserved.
//  See LICENSE.txt for details.
//
//  This software is distributed WITHOUT ANY WARRANTY; without even
//  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
//  PURPOSE.  See the above copyright notice for more information.
//=========================================================================

#ifndef __smoab_detail_ReduceSpectralMesh_h
#define __smoab_detail_ReduceSpectralMesh_h

#include "SimpleMoab.h"
#include "vtkCellType.h"

#include <algorithm>
#include <vector>

namespace smoab{ namespace detail{


class ReduceSpectralMesh
{
public:
  ReduceSpectralMeshReduceHighOrderCell(smoab::Range const& cells, moab::Interface* moab):
    LinearCellConnectivity(),
    HighOrderCellConnectivity()
    {
    int count = 0;
    const std::size_t cellSize=cells.size();
    while(count != cellSize)
      {
      EntityHandle* connectivity;
      int numVerts=0, iterationCount=0;
      //use the highly efficent calls, since we know that are of the same dimension
      moab->connect_iterate(cells.begin()+count,
                            cells.end(),
                            connectivity,
                            numVerts,
                            iterationCount);
      //if we didn't read anything, break!
      if(iterationCount == 0)
        {
        break;
        }

      //identify the cell type that we currently have,
      //store that along with the connectivity in a temp storage vector
      const moab::EntityType type = moab->type_from_handle(*cells.begin()+count);

      //instead of storing the connectivity in a single array,
      //what my goal is to have multiple vectors. The first vector
      //will hold all the linear cells, while the second vector
      //will hold the high order cells.

      //Since connect_iterate returns the number of cells of a given
      //type that we have read we can also store the RunLegthInfo
      //for all the cells allowing us to apply transformations to the
      //high order cells efficently in bulk.

      //while all these cells are contiously of the same type,
      //quadric hexs in vtk have 20 points, but moab has 21 so we
      //need to store this difference
      }
    }

private:
  std::vector<EntityHandle> LinearCellConnectivity;
  std::vector<EntityHandle> HighOrderCellConnectivity;

  std::vector<detail::ContinousCellInfo> LinearCellInfo;
  std::vector<detail::ContinousCellInfo> HighOrderCellInfo;


} } //namespace smoab::detail

#endif
