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

/// JSON response template for Skia Gold expectations request:
/// https://flutter-gold.skia.org/json/expectations/commit/HEAD
String rawExpectationsTemplate() {
  return '''
    {
      "md5": "a7489b00e03a1846e43500b7c14dd7b0",
      "master": {
        "flutter.golden_test.1": {
          "55109a4bed52acc780530f7a9aeff6c0": 1
        },
        "flutter.golden_test.3": {
          "87cb35131e6ad4b57d4d09d59ae743c3": 1,
          "dc94eb2c39c0c8ae11a4efd090b72f94": 1,
          "f2583c9003978a06b7888878bdc089e2": 1
        },
        "flutter.golden_test.2": {
          "eb03a5e3114c9ecad5e4f1178f285a49": 1,
          "f14631979de24fca6e14ad247d5f2bd6": 1
        }
      }
    }
  ''';
}

/// Decoded json response template for Skia Gold expectations request:
/// https://flutter-gold.skia.org/json/expectations/commit/HEAD
Map<String, List<String>> expectationsTemplate() {
  return <String, List<String>>{
    'flutter.golden_test.1': <String>[
      '55109a4bed52acc780530f7a9aeff6c0'
    ],
    'flutter.golden_test.3': <String>[
      '87cb35131e6ad4b57d4d09d59ae743c3',
      'dc94eb2c39c0c8ae11a4efd090b72f94',
      'f2583c9003978a06b7888878bdc089e2',
    ],
    'flutter.golden_test.2': <String>[
      'eb03a5e3114c9ecad5e4f1178f285a49',
      'f14631979de24fca6e14ad247d5f2bd6',
    ],
  };
}

/// Json response template for Skia Gold digest request:
/// https://flutter-gold.skia.org/json/details?test=[testName]&digest=[expectation]
String digestResponseTemplate({
  String testName = 'flutter.golden_test.1',
  String expectation = '55109a4bed52acc780530f7a9aeff6c0',
  String platform = 'macos',
  String status = 'positive',
}) {
  return '''
    {
  "digest": {
    "test": "$testName",
    "digest": "$expectation",
    "status": "$status",
    "paramset": {
      "Platform": [
        "$platform"
      ],
      "ext": [
        "png"
      ],
      "name": [
        "$testName"
      ],
      "source_type": [
        "flutter"
      ]
    },
    "traces": {
      "tileSize": 200,
      "traces": [
        {
          "data": [
            {
              "x": 0,
              "y": 0,
              "s": 0
            },
            {
              "x": 1,
              "y": 0,
              "s": 0
            },
            {
              "x": 199,
              "y": 0,
              "s": 0
            }
          ],
          "label": ",Platform=$platform,name=$testName,source_type=flutter,",
          "params": {
            "Platform": "$platform",
            "ext": "png",
            "name": "$testName",
            "source_type": "flutter"
          }
        }
      ],
      "digests": [
        {
          "digest": "$expectation",
          "status": "$status"
        }
      ]
    },
    "closestRef": "pos",
    "refDiffs": {
      "neg": null,
      "pos": {
        "numDiffPixels": 999,
        "pixelDiffPercent": 0.4995,
        "maxRGBADiffs": [
          86,
          86,
          86,
          0
        ],
        "dimDiffer": false,
        "diffs": {
          "combined": 0.381955,
          "percent": 0.4995,
          "pixel": 999
        },
        "digest": "aa748136c70cefdda646df5be0ae189d",
        "status": "positive",
        "paramset": {
          "Platform": [
            "macos"
          ],
          "ext": [
            "png"
          ],
          "name": [
            "$testName"
          ],
          "source_type": [
            "flutter"
          ]
        },
        "n": 197
      }
    }
  },
  "commits": [
    {
      "commit_time": 1568069344,
      "hash": "399bb04e2de41665320d3c888f40af6d8bc734a2",
      "author": "Contributor A (contributorA@getMail.com)"
    },
    {
      "commit_time": 1568078053,
      "hash": "0f365d3add253a65e5e5af1024f56c6169bf9739",
      "author": "Contributor B (contributorB@getMail.com)"
    },
    {
      "commit_time": 1569353925,
      "hash": "81e693a7fe3b808cc9ae2bb3a2cbe404e67ec773",
      "author": "Contributor C (contributorC@getMail.com)"
    }
  ]
}
  ''';
}

/// Json response template for Skia Gold image request:
/// https://flutter-gold.skia.org/img/images/[imageHash].png
List<List<int>> imageResponseTemplate() {
  return <List<int>>[
    <int>[137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73,
      72, 68, 82, 0, 0, 0, 1, 0, 0, 0, 1, 8, 6, 0, 0, 0, 31, 21, 196, 137, 0],
    <int>[0, 0, 11, 73, 68, 65, 84, 120, 1, 99, 97, 0, 2, 0,
      0, 25, 0, 5, 144, 240, 54, 245, 0, 0, 0, 0, 73, 69, 78, 68, 174, 66, 96,
      130],
  ];
}
