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

// @dart = 2.9

part of layout;

/**
 * Caches the layout parameters that were specified in CSS during a layout
 * computation. These values are immutable during a layout.
 */
// TODO(jmesserly): I would like all fields to be final, but it's too painful
// to do this right now in Dart. If I create a factory constructor, then I need
// to create locals, and pass all parameters to the real constructor. Each
// field ends up being mentioned 4 times instead of just twice.
class GridLayoutParams extends LayoutParams {
  /** The coordinates of this item in the grid. */
  int row;
  int column;
  int rowSpan;
  int columnSpan;
  int layer;

  /** Alignment within its box */
  GridItemAlignment rowAlign;
  GridItemAlignment columnAlign;

  GridLayoutParams(Positionable view, GridLayout layout) : super(view.node) {
    // TODO(jmesserly): this can be cleaned up a lot by just passing "view"
    // into the parsers.

    rowAlign =
        new GridItemAlignment.fromString(view.customStyle['grid-row-align']);
    columnAlign =
        new GridItemAlignment.fromString(view.customStyle['grid-column-align']);

    layer = StringUtils.parseInt(view.customStyle['grid-layer'], 0);

    rowSpan = StringUtils.parseInt(view.customStyle['grid-row-span']);
    columnSpan = StringUtils.parseInt(view.customStyle['grid-column-span']);

    var line = _GridItemParser.parse(view.customStyle['grid-row'], layout.rows);
    if (line != null) {
      row = line.start;
      if (line.length != null) {
        if (rowSpan != null) {
          throw new UnsupportedError(
              'grid-row-span cannot be with grid-row that defines an end');
        }
        rowSpan = line.length;
      }
    }

    line =
        _GridItemParser.parse(view.customStyle['grid-column'], layout.columns);

    if (line != null) {
      column = line.start;
      if (line.length != null) {
        if (columnSpan != null) {
          throw new UnsupportedError(
              'grid-column-span cannot be with grid-column that defines an end');
        }
        columnSpan = line.length;
      }
    }

    String cell = _GridTemplateParser.parseCell(view.customStyle['grid-cell']);
    if (cell != null && cell != 'none') {
      // TODO(jmesserly): I didn't see anything spec'd about conflicts and
      // error handling. For now, throw an error on a misconfigured view.
      // CSS is designed to be a permissive language, though, so we should do
      // better and resolve conflicts more intelligently.
      if (row != null ||
          column != null ||
          rowSpan != null ||
          columnSpan != null) {
        throw new UnsupportedError(
            'grid-cell cannot be used with grid-row and grid-column');
      }

      if (layout.template == null) {
        throw new UnsupportedError(
            'grid-cell requires that grid-template is set on the parent');
      }

      final rect = layout.template.lookupCell(cell);
      row = rect.row;
      column = rect.column;
      rowSpan = rect.rowSpan;
      columnSpan = rect.columnSpan;
    } else {
      // Apply default row, column span values.
      if (rowSpan == null) rowSpan = 1;
      if (columnSpan == null) columnSpan = 1;

      if (row == null && column == null) {
        throw new UnsupportedError('grid-flow is not implemented' +
            ' so at least one row or one column must be defined');
      }

      if (row == null) row = 1;
      if (column == null) column = 1;
    }

    assert(row > 0 && rowSpan > 0 && column > 0 && columnSpan > 0);
  }
}
