#ifndef HOST_PSEUDOLOCALIZE_H
#define HOST_PSEUDOLOCALIZE_H

#include <base/macros.h>
#include "StringPool.h"

class PseudoMethodImpl {
 public:
  virtual ~PseudoMethodImpl() {}
  virtual String16 start() { return String16(); }
  virtual String16 end() { return String16(); }
  virtual String16 text(const String16& text) = 0;
  virtual String16 placeholder(const String16& text) = 0;
};

class PseudoMethodNone : public PseudoMethodImpl {
 public:
  PseudoMethodNone() {}
  String16 text(const String16& text) { return text; }
  String16 placeholder(const String16& text) { return text; }
 private:
  DISALLOW_COPY_AND_ASSIGN(PseudoMethodNone);
};

class PseudoMethodBidi : public PseudoMethodImpl {
 public:
  String16 text(const String16& text);
  String16 placeholder(const String16& text);
};

class PseudoMethodAccent : public PseudoMethodImpl {
 public:
  PseudoMethodAccent() : mDepth(0), mWordCount(0), mLength(0) {}
  String16 start();
  String16 end();
  String16 text(const String16& text);
  String16 placeholder(const String16& text);
 private:
  size_t mDepth;
  size_t mWordCount;
  size_t mLength;
};

class Pseudolocalizer {
 public:
  Pseudolocalizer(PseudolocalizationMethod m);
  ~Pseudolocalizer() { if (mImpl) delete mImpl; }
  void setMethod(PseudolocalizationMethod m);
  String16 start() { return mImpl->start(); }
  String16 end() { return mImpl->end(); }
  String16 text(const String16& text);
 private:
  PseudoMethodImpl *mImpl;
  size_t mLastDepth;
};

#endif // HOST_PSEUDOLOCALIZE_H

