// Copyright 2014 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.

import 'package:flutter/material.dart';

import 'stock_arrow.dart';
import 'stock_data.dart';

typedef StockRowActionCallback = void Function(Stock stock);

class StockRow extends StatelessWidget {
  StockRow({
    required this.stock,
    this.onPressed,
    this.onDoubleTap,
    this.onLongPressed,
  }) : super(key: ObjectKey(stock));

  final Stock stock;
  final StockRowActionCallback? onPressed;
  final StockRowActionCallback? onDoubleTap;
  final StockRowActionCallback? onLongPressed;

  static const double kHeight = 79.0;

  GestureTapCallback? _getHandler(StockRowActionCallback? callback) {
    return callback == null ? null : () => callback(stock);
  }

  @override
  Widget build(BuildContext context) {
    final String lastSale = '\$${stock.lastSale.toStringAsFixed(2)}';
    String changeInPrice = '${stock.percentChange.toStringAsFixed(2)}%';
    if (stock.percentChange > 0)
      changeInPrice = '+$changeInPrice';
    return InkWell(
      key: ValueKey<String>(stock.symbol),
      onTap: _getHandler(onPressed),
      onDoubleTap: _getHandler(onDoubleTap),
      onLongPress: _getHandler(onLongPressed),
      child: Container(
        padding: const EdgeInsets.fromLTRB(16.0, 16.0, 16.0, 20.0),
        decoration: BoxDecoration(
          border: Border(
            bottom: BorderSide(color: Theme.of(context).dividerColor)
          )
        ),
        child: Row(
          children: <Widget>[
            Container(
              margin: const EdgeInsets.only(right: 5.0),
              child: Hero(
                tag: stock,
                child: StockArrow(percentChange: stock.percentChange),
              ),
            ),
            Expanded(
              child: Row(
                crossAxisAlignment: CrossAxisAlignment.baseline,
                textBaseline: DefaultTextStyle.of(context).style.textBaseline,
                children: <Widget>[
                  Expanded(
                    flex: 2,
                    child: Text(
                      stock.symbol
                    ),
                  ),
                  Expanded(
                    child: Text(
                      lastSale,
                      textAlign: TextAlign.right,
                    ),
                  ),
                  Expanded(
                    child: Text(
                      changeInPrice,
                      textAlign: TextAlign.right,
                    ),
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}
