// Copyright (c) 2015, Google Inc. 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.

import 'package:test/test.dart';
import 'package:vector_math/vector_math.dart';

Vector2 $v2(double x, double y) => Vector2(x, y);

Vector3 $v3(double x, double y, double z) => Vector3(x, y, z);

Vector4 $v4(double x, double y, double z, double w) => Vector4(x, y, z, w);

void relativeTest(dynamic output, dynamic expectedOutput) {
  final errorThreshold = 0.0005;
  final num error = relativeError(output, expectedOutput).abs();
  expect(
    error >= errorThreshold,
    isFalse,
    reason: '$output != $expectedOutput : relativeError = $error',
  );
}

void absoluteTest(dynamic output, dynamic expectedOutput) {
  final errorThreshold = 0.0005;
  final num error = absoluteError(output, expectedOutput).abs();
  expect(
    error >= errorThreshold,
    isFalse,
    reason: '$output != $expectedOutput : absoluteError = $error',
  );
}

dynamic makeMatrix(int rows, int cols) {
  if (rows != cols) {
    return null;
  }

  if (cols == 2) {
    return Matrix2.zero();
  }
  if (cols == 3) {
    return Matrix3.zero();
  }
  if (cols == 4) {
    return Matrix4.zero();
  }

  return null;
}

T parseMatrix<T>(String input) {
  input = input.trim();
  final rows = input.split('\n');
  final values = <double>[];
  var col_count = 0;
  for (var i = 0; i < rows.length; i++) {
    rows[i] = rows[i].trim();
    final cols = rows[i].split(' ');
    for (var j = 0; j < cols.length; j++) {
      cols[j] = cols[j].trim();
    }

    for (var j = 0; j < cols.length; j++) {
      if (cols[j].isEmpty) {
        continue;
      }
      if (i == 0) {
        col_count++;
      }
      values.add(double.parse(cols[j]));
    }
  }

  final dynamic m = makeMatrix(rows.length, col_count);
  for (var j = 0; j < rows.length; j++) {
    for (var i = 0; i < col_count; i++) {
      // ignore: avoid_dynamic_calls
      m[m.index(j, i)] = values[j * col_count + i];
    }
  }

  return m as T;
}

T parseVector<T extends Vector>(String v) {
  v = v.trim();
  final Pattern pattern = RegExp(
    '[\\s]+',
    multiLine: true,
    caseSensitive: false,
  );
  final rows = v.split(pattern);
  final values = <double>[];
  for (var i = 0; i < rows.length; i++) {
    rows[i] = rows[i].trim();
    if (rows[i].isEmpty) {
      continue;
    }
    values.add(double.parse(rows[i]));
  }

  Vector r;
  if (values.length == 2) {
    r = Vector2(values[0], values[1]);
  } else if (values.length == 3) {
    r = Vector3(values[0], values[1], values[2]);
  } else if (values.length == 4) {
    r = Vector4(values[0], values[1], values[2], values[3]);
  } else {
    throw UnimplementedError();
  }

  return r as T;
}
