// Copyright 2025 International Digital Economy Academy
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

///|
priv struct GridTrackSizingItemSnapshot {
  placed : Array[Bool]
  start : Array[Int]
  span : Array[Int]
  minimum_contribution : Array[Double]
  min_content_contribution : Array[Double]
  max_content_contribution : Array[Double]
  crosses_flexible_track : Array[Bool]
  crosses_intrinsic_track : Array[Bool]
}

///|
fn grid_column_track_sizing_item_snapshot(
  items : Array[GridItem],
) -> GridTrackSizingItemSnapshot {
  let placed : Array[Bool] = []
  let start : Array[Int] = []
  let span : Array[Int] = []
  let minimum_contribution : Array[Double] = []
  let min_content_contribution : Array[Double] = []
  let max_content_contribution : Array[Double] = []
  let crosses_flexible_track : Array[Bool] = []
  let crosses_intrinsic_track : Array[Bool] = []
  for item in items {
    ignore(item.source_order)
    placed.push(item.placed)
    start.push(item.column)
    span.push(item.column_span)
    minimum_contribution.push(item.column_minimum_contribution)
    min_content_contribution.push(item.column_min_content_contribution)
    max_content_contribution.push(item.column_max_content_contribution)
    crosses_flexible_track.push(item.crosses_flexible_column)
    crosses_intrinsic_track.push(item.crosses_intrinsic_column)
  }
  {
    placed,
    start,
    span,
    minimum_contribution,
    min_content_contribution,
    max_content_contribution,
    crosses_flexible_track,
    crosses_intrinsic_track,
  }
}

///|
fn grid_row_track_sizing_item_snapshot(
  items : Array[GridItem],
) -> GridTrackSizingItemSnapshot {
  let placed : Array[Bool] = []
  let start : Array[Int] = []
  let span : Array[Int] = []
  let minimum_contribution : Array[Double] = []
  let min_content_contribution : Array[Double] = []
  let max_content_contribution : Array[Double] = []
  let crosses_flexible_track : Array[Bool] = []
  let crosses_intrinsic_track : Array[Bool] = []
  for item in items {
    ignore(item.source_order)
    placed.push(item.placed)
    start.push(item.row)
    span.push(item.row_span)
    minimum_contribution.push(item.row_minimum_contribution)
    min_content_contribution.push(item.row_minimum_contribution)
    max_content_contribution.push(item.row_max_content_contribution)
    crosses_flexible_track.push(item.crosses_flexible_row)
    crosses_intrinsic_track.push(item.crosses_intrinsic_row)
  }
  {
    placed,
    start,
    span,
    minimum_contribution,
    min_content_contribution,
    max_content_contribution,
    crosses_flexible_track,
    crosses_intrinsic_track,
  }
}

///|
fn compute_max_content_spanning_track_sizes_for_grid_items(
  tracks : Array[Dimension],
  items : Array[GridItem],
) -> (Array[Double], Double)? {
  compute_max_content_spanning_track_sizes(
    tracks,
    grid_column_track_sizing_item_snapshot(items),
  )
}

///|
fn compute_max_content_spanning_row_track_sizes_for_grid_items(
  tracks : Array[Dimension],
  items : Array[GridItem],
) -> (Array[Double], Double)? {
  compute_max_content_spanning_track_sizes(
    tracks,
    grid_row_track_sizing_item_snapshot(items),
  )
}