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

import 'dart:ui' as ui;

import 'package:flutter/rendering.dart';

class _BaselinePainter extends CustomPainter {
  const _BaselinePainter({
    this.paragraph
  });

  final RenderParagraph paragraph;

  void paint(Canvas canvas, Size size) {
    double baseline = paragraph.getDistanceToBaseline(TextBaseline.alphabetic);
    double w = paragraph.getMaxIntrinsicWidth(new BoxConstraints.loose(size));
    double h = paragraph.getMaxIntrinsicHeight(new BoxConstraints.loose(size));

    Path path;
    Paint paint;

    // top and bottom
    path = new Path();
    path.moveTo(0.0, 0.0);
    path.lineTo(w, 0.0);
    path.moveTo(0.0, h);
    path.lineTo(w, h);
    paint = new Paint()
     ..color = const Color(0xFFFF9000)
     ..style = ui.PaintingStyle.stroke
     ..strokeWidth = 1.5;
    canvas.drawPath(path, paint);

    // baseline
    path = new Path();
    path.moveTo(0.0, baseline);
    path.lineTo(w, baseline);
    paint = new Paint()
     ..color = const Color(0xFF00FF90)
     ..style = ui.PaintingStyle.stroke
     ..strokeWidth = 1.5;
    canvas.drawPath(path, paint);
  }

  // TODO(abarth): We have no good way of detecting when the paragraph's intrinsic dimensions change.
  bool shouldRepaint(_BaselinePainter oldPainter) => true;
}

RenderBox getBox(double lh) {
  RenderParagraph paragraph = new RenderParagraph(
    new StyledTextSpan(
      new TextStyle(
        color: const Color(0xFF0000A0)
      ),
      <TextSpan>[
        new PlainTextSpan('test'),
        new StyledTextSpan(
          new TextStyle(
            fontFamily: 'serif',
            fontSize: 50.0,
            height: lh
          ),
          <TextSpan>[new PlainTextSpan('مرحبا Hello')]
        )
      ]
    )
  );
  return new RenderPadding(
    padding: new EdgeDims.all(10.0),
    child: new RenderConstrainedBox(
      additionalConstraints: new BoxConstraints.tightFor(height: 200.0),
      child: new RenderDecoratedBox(
        decoration: new BoxDecoration(
          backgroundColor: const Color(0xFFFFFFFF)
        ),
        child: new RenderPadding(
          padding: new EdgeDims.all(10.0),
          child: new RenderCustomPaint(
            painter: new _BaselinePainter(
              paragraph: paragraph
            ),
            child: paragraph
          )
        )
      )
    )
  );
}

void main() {
  RenderBox root = new RenderFlex(children: <RenderBox>[
      new RenderConstrainedBox(
        additionalConstraints: new BoxConstraints.tightFor(height: 50.0)
      ),
      getBox(null),
      getBox(1.2),
    ],
    direction: FlexDirection.vertical,
    alignItems: FlexAlignItems.stretch
  );
  new RenderingFlutterBinding(root: root);
}