// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "../export.h"
#include "../wrappers.h"
#include "third_party/skia/modules/skparagraph/include/Paragraph.h"

using namespace skia::textlayout;
using namespace Skwasm;

SKWASM_EXPORT ParagraphStyle* paragraphStyle_create() {
  auto style = new ParagraphStyle();

  // This is the default behavior in Flutter
  style->setReplaceTabCharacters(true);

  // Default text style has a black color
  TextStyle textStyle;
  textStyle.setColor(SK_ColorBLACK);
  style->setTextStyle(textStyle);

  return style;
}

SKWASM_EXPORT void paragraphStyle_dispose(ParagraphStyle* style) {
  delete style;
}

SKWASM_EXPORT void paragraphStyle_setTextAlign(ParagraphStyle* style,
                                               TextAlign align) {
  style->setTextAlign(align);
}

SKWASM_EXPORT void paragraphStyle_setTextDirection(ParagraphStyle* style,
                                                   TextDirection direction) {
  style->setTextDirection(direction);
}

SKWASM_EXPORT void paragraphStyle_setMaxLines(ParagraphStyle* style,
                                              size_t maxLines) {
  style->setMaxLines(maxLines);
}

SKWASM_EXPORT void paragraphStyle_setHeight(ParagraphStyle* style,
                                            SkScalar height) {
  style->setHeight(height);
}

SKWASM_EXPORT void paragraphStyle_setTextHeightBehavior(
    ParagraphStyle* style,
    bool applyHeightToFirstAscent,
    bool applyHeightToLastDescent) {
  TextHeightBehavior behavior;
  if (!applyHeightToFirstAscent && !applyHeightToLastDescent) {
    behavior = kDisableAll;
  } else if (!applyHeightToLastDescent) {
    behavior = kDisableLastDescent;
  } else if (!applyHeightToFirstAscent) {
    behavior = kDisableFirstAscent;
  } else {
    behavior = kAll;
  }
  style->setTextHeightBehavior(behavior);
}

SKWASM_EXPORT void paragraphStyle_setEllipsis(ParagraphStyle* style,
                                              SkString* ellipsis) {
  style->setEllipsis(*ellipsis);
}

SKWASM_EXPORT void paragraphStyle_setStrutStyle(ParagraphStyle* style,
                                                StrutStyle* strutStyle) {
  style->setStrutStyle(*strutStyle);
}

SKWASM_EXPORT void paragraphStyle_setTextStyle(ParagraphStyle* style,
                                               TextStyle* textStyle) {
  style->setTextStyle(*textStyle);
}
