// 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 template for the contents of the auth_opt.json file created by goldctl.
String authTemplate({
  bool gsutil = false,
}) {
  return '''
    {
      "Luci":false,
      "ServiceAccount":"${gsutil ? '' : '/packages/flutter/test/widgets/serviceAccount.json'}",
      "GSUtil":$gsutil
    }
  ''';
}

/// 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 ignore request:
/// https://flutter-gold.skia.org/json/ignores
String ignoreResponseTemplate({
  String pullRequestNumber = '0000',
  String testName = 'flutter.golden_test.1',
  String otherTestName = 'flutter.golden_test.1',
  String expires = '2019-09-06T21:28:18.815336Z',
  String otherExpires = '2019-09-06T21:28:18.815336Z',
}) {
  return '''
    [
      {
        "id": "7579425228619212078",
        "name": "contributor@getMail.com",
        "updatedBy": "contributor@getMail.com",
        "expires": "$expires",
        "query": "ext=png&name=$testName",
        "note": "https://github.com/flutter/flutter/pull/$pullRequestNumber"
      },
      {
        "id": "7579425228619212078",
        "name": "contributor@getMail.com",
        "updatedBy": "contributor@getMail.com",
        "expires": "$otherExpires",
        "query": "ext=png&name=$otherTestName",
        "note": "https://github.com/flutter/flutter/pull/99999"
      }
    ]
  ''';
}

/// 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],
  ];
}
