// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

part of layout;

// This file has classes representing the grid sizing functions

/**
 * Represents the sizing function used for the min or max of a row or column.
 */
// TODO(jmesserly): rename to GridSizing, or make internal
class SizingFunction {
  const SizingFunction();

  bool get isContentSized => isMinContentSized || isMaxContentSized;
  bool get isMinContentSized => false;
  bool get isMaxContentSized => false;
  bool get isFraction => false;

  num resolveLength(num gridSize) => 0;

  num get fractionValue => 0;

  // TODO(jmesserly): this is only needed because FixedSizing is mutable
  SizingFunction clone() => this;
}

/**
 * Fixed size reprensents a length as defined by CSS3 Values spec.
 * Can also be a percentage of the Grid element's logical width (for columns)
 * or logical height (for rows). When the width or height of the Grid element
 * is undefined, the percentage is ignored and the Grid Track will be
 * auto-sized.
 */
class FixedSizing extends SizingFunction {
  final String units;
  final num length;

  // TODO(jmesserly): kind of ugly to have this mutable property here, but
  // we need to correctly track whether we're content sized during a layout
  bool _contentSized;

  FixedSizing(this.length, [this.units = 'px']) : _contentSized = false {
    if (units != 'px' && units != '%') {
      // TODO(jmesserly): support other unit types
      throw new UnsupportedError('Units other than px and %');
    }
  }

  // TODO(jmesserly): this is only needed because of our mutable property
  FixedSizing clone() => new FixedSizing(length, units);

  bool get isMinContentSized => _contentSized;

  num resolveLength(num gridSize) {
    if (units == '%') {
      if (gridSize == null) {
        // Use content size when the grid doesn't have an absolute size in this
        // dimension
        _contentSized = true;
        return 0;
      }
      _contentSized = false;
      return (length / 100) * gridSize;
    } else {
      return length;
    }
  }

  String toString() => 'FixedSizing: ${length}${units} $_contentSized';
}

/**
 * Fraction is a non-negative floating-point number followed by 'fr'. Each
 * fraction value takes a share of the remaining space proportional to its
 * number.
 */
class FractionSizing extends SizingFunction {
  final num fractionValue;
  FractionSizing(this.fractionValue);

  bool get isFraction => true;

  String toString() => 'FixedSizing: ${fractionValue}fr';
}

class MinContentSizing extends SizingFunction {
  const MinContentSizing();

  bool get isMinContentSized => true;

  String toString() => 'MinContentSizing';
}

class MaxContentSizing extends SizingFunction {
  const MaxContentSizing();

  bool get isMaxContentSized {
    return true;
  }

  String toString() => 'MaxContentSizing';
}

/** The min and max sizing functions for a track. */
class TrackSizing {
  /** The min sizing function for the track. */
  final SizingFunction min;

  /** The min sizing function for the track. */
  final SizingFunction max;

  const TrackSizing.auto()
      : min = const MinContentSizing(),
        max = const MaxContentSizing();

  TrackSizing(this.min, this.max) {}

  // TODO(jmesserly): this is only needed because FixedSizing is mutable
  TrackSizing clone() => new TrackSizing(min.clone(), max.clone());
}

/** Represents a GridTrack breadth property. */
// TODO(jmesserly): these classes could be replaced with reflection/mirrors
abstract class _BreadthAccumulator {
  void setSize(GridTrack t, num value);
  num getSize(GridTrack t);

  SizingFunction getSizingFunction(GridTrack t);
}

class _UsedBreadthAccumulator implements _BreadthAccumulator {
  const _UsedBreadthAccumulator();

  void setSize(GridTrack t, num value) {
    t.usedBreadth = value;
  }

  num getSize(GridTrack t) => t.usedBreadth;

  SizingFunction getSizingFunction(GridTrack t) => t.minSizing;
}

class _MaxBreadthAccumulator implements _BreadthAccumulator {
  const _MaxBreadthAccumulator();

  void setSize(GridTrack t, num value) {
    t.maxBreadth = value;
  }

  num getSize(GridTrack t) => t.maxBreadth;

  SizingFunction getSizingFunction(GridTrack t) => t.maxSizing;
}
