
// Licensed 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.
//
// Copyright 2005-2010 Google, Inc.
// Author: jpr@google.com (Jake Ratkiewicz)

// These classes are only recommended for use in high-level scripting
// applications. Most users should use the lower-level templated versions
// corresponding to these classes.

#include <fst/script/fst-class.h>
#include <fst/script/register.h>
#include <fst/fst-decl.h>
#include <fst/union.h>
#include <fst/reverse.h>
#include <fst/equal.h>

namespace fst {
namespace script {

//
//  REGISTRATION
//

REGISTER_FST_CLASSES(StdArc);
REGISTER_FST_CLASSES(LogArc);
REGISTER_FST_CLASSES(Log64Arc);

//
//  FST CLASS METHODS
//

template<class FstT>
FstT *ReadFst(istream &in, const string &fname) {
  if (!in) {
    LOG(ERROR) << "ReadFst: Can't open file: " << fname;
    return 0;
  }

  FstHeader hdr;
  if (!hdr.Read(in, fname)) {
    return 0;
  }

  FstReadOptions read_options(fname, &hdr);

  typename IORegistration<FstT>::Register *reg =
      IORegistration<FstT>::Register::GetRegister();

  const typename IORegistration<FstT>::Reader reader =
      reg->GetReader(hdr.ArcType());

  if (!reader) {
    LOG(ERROR) << "ReadFst : unknown arc type \""
               << hdr.ArcType() << "\" : " << read_options.source;
    return 0;
  }

  return reader(in, read_options);
}

FstClass *FstClass::Read(const string &fname) {
  if (!fname.empty()) {
    ifstream in(fname.c_str(), ifstream::in | ifstream::binary);
    return ReadFst<FstClass>(in, fname);
  } else {
    return ReadFst<FstClass>(std::cin, "standard input");
  }
}

//
//  MUTABLE FST CLASS METHODS
//

MutableFstClass *MutableFstClass::Read(const string &fname, bool convert) {
  if (convert == false) {
    if (!fname.empty()) {
      ifstream in(fname.c_str(), ifstream::in | ifstream::binary);
      return ReadFst<MutableFstClass>(in, fname);
    } else {
      return ReadFst<MutableFstClass>(std::cin, "standard input");
    }
  } else {  // Converts to VectorFstClass if not mutable.
    FstClass *ifst = FstClass::Read(fname);
    if (!ifst) return 0;
    if (ifst->Properties(fst::kMutable, false)) {
      return static_cast<MutableFstClass *>(ifst);
    } else {
      MutableFstClass *ofst = new VectorFstClass(*ifst);
      delete ifst;
      return ofst;
    }
  }
}

//
// VECTOR FST CLASS METHODS
//

IORegistration<VectorFstClass>::Entry GetVFSTRegisterEntry(
    const string &arc_type) {
  IORegistration<VectorFstClass>::Register *reg =
      IORegistration<VectorFstClass>::Register::GetRegister();
  const IORegistration<VectorFstClass>::Entry &entry = reg->GetEntry(arc_type);

  if (entry.converter == 0) {
    LOG(ERROR) << "Unknown arc type " << arc_type;
    return entry;
  }

  return entry;
}

VectorFstClass::VectorFstClass(const FstClass &other)
    : MutableFstClass(GetVFSTRegisterEntry(other.ArcType()).converter(other)) {
}

VectorFstClass::VectorFstClass(const string &arc_type)
    : MutableFstClass(GetVFSTRegisterEntry(arc_type).creator()) { }

VectorFstClass *VectorFstClass::Read(const string &fname) {
  if (!fname.empty()) {
    ifstream in(fname.c_str(), ifstream::in | ifstream::binary);
    return ReadFst<VectorFstClass>(in, fname);
  } else {
    return ReadFst<VectorFstClass>(std::cin, "standard input");
  }
}

}  // namespace script
}  // namespace fst
