package utils

import (
	"testing"

	"github.com/stretchr/testify/require"
)

var testMetaJSONs = [][]byte{
	[]byte(`{
  "files": [
    {
      "sha256": "aa5cefba077644dbb2aa1d7fae2a0f879b56411195ad62d18caaf4ec76fae48f",
      "start_key": "7480000000000000365f720000000000000000",
      "end_key": "7480000000000000365f72ffffffffffffffff00",
      "name": "1_2_29_6e97c3b17c657c4413724f614a619f5b665b990187b159e7d2b92552076144b6_1617351201040_write.sst",
      "end_version": 423978913229963260,
      "crc64xor": 8093018294706077000,
      "total_kvs": 1,
      "total_bytes": 27,
      "cf": "write",
      "size": 1423
    }
  ],
  "schemas": [
    {
      "table": {
        "Lock": null,
        "ShardRowIDBits": 0,
        "auto_id_cache": 0,
        "auto_inc_id": 0,
        "auto_rand_id": 0,
        "auto_random_bits": 0,
        "charset": "utf8mb4",
        "collate": "utf8mb4_bin",
        "cols": [
          {
            "change_state_info": null,
            "comment": "",
            "default": null,
            "default_bit": null,
            "default_is_expr": false,
            "dependences": null,
            "generated_expr_string": "",
            "generated_stored": false,
            "hidden": false,
            "id": 1,
            "name": {
              "L": "pk",
              "O": "pk"
            },
            "offset": 0,
            "origin_default": null,
            "origin_default_bit": null,
            "state": 5,
            "type": {
              "charset": "utf8mb4",
              "collate": "utf8mb4_bin",
              "decimal": 0,
              "elems": null,
              "flag": 4099,
              "flen": 256,
              "tp": 15
            },
            "version": 2
          }
        ],
        "comment": "",
        "common_handle_version": 1,
        "compression": "",
        "constraint_info": null,
        "fk_info": null,
        "id": 54,
        "index_info": [
          {
            "comment": "",
            "id": 1,
            "idx_cols": [
              {
                "length": -1,
                "name": {
                  "L": "pk",
                  "O": "pk"
                },
                "offset": 0
              }
            ],
            "idx_name": {
              "L": "primary",
              "O": "PRIMARY"
            },
            "index_type": 1,
            "is_global": false,
            "is_invisible": false,
            "is_primary": true,
            "is_unique": true,
            "state": 5,
            "tbl_name": {
              "L": "",
              "O": ""
            }
          }
        ],
        "is_columnar": false,
        "is_common_handle": true,
        "max_col_id": 1,
        "max_cst_id": 0,
        "max_idx_id": 1,
        "max_shard_row_id_bits": 0,
        "name": {
          "L": "test",
          "O": "test"
        },
        "partition": null,
        "pk_is_handle": false,
        "pre_split_regions": 0,
        "sequence": null,
        "state": 5,
        "tiflash_replica": null,
        "update_timestamp": 423978913176223740,
        "version": 4,
        "view": null
      },
      "db": {
        "charset": "utf8mb4",
        "collate": "utf8mb4_bin",
        "db_name": {
          "L": "test",
          "O": "test"
        },
        "id": 1,
        "state": 5
      },
      "crc64xor": 8093018294706077000,
      "total_kvs": 1,
      "total_bytes": 27
    }
  ],
  "ddls": [],
  "cluster_id": 6946469498797568000,
  "cluster_version": "\"5.0.0-rc.x\"\n",
  "end_version": 423978913229963260,
  "br_version": "BR\nRelease Version: v5.0.0-master\nGit Commit Hash: c0d60dae4998cf9ac40f02e5444731c15f0b2522\nGit Branch: HEAD\nGo Version: go1.13.4\nUTC Build Time: 2021-03-25 08:10:08\nRace Enabled: false"
}
`),
	[]byte(`{
  "files": [
    {
      "sha256": "5759c4c73789d6ecbd771b374d42e72a309245d31911efc8553423303c95f22c",
      "end_key": "7480000000000000ff0500000000000000f8",
      "name": "1_4_2_default.sst",
      "total_kvs": 153,
      "total_bytes": 824218,
      "cf": "default",
      "size": 44931
    },
    {
      "sha256": "87597535ce0edbc9a9ef124777ad1d23388467e60c0409309ad33af505c1ea5b",
      "start_key": "7480000000000000ff0f00000000000000f8",
      "end_key": "7480000000000000ff1100000000000000f8",
      "name": "1_16_8_58be9b5dfa92efb6a7de2127c196e03c5ddc3dd8ff3a9b3e7cd4c4aa7c969747_1617689203876_default.sst",
      "total_kvs": 1,
      "total_bytes": 396,
      "cf": "default",
      "size": 1350
    },
    {
      "sha256": "97bd1b07f9cc218df089c70d454e23c694113fae63a226ae0433165a9c3d75d9",
      "start_key": "7480000000000000ff1700000000000000f8",
      "end_key": "7480000000000000ff1900000000000000f8",
      "name": "1_24_12_72fa67937dd58d654197abadeb9e633d92ebccc5fd993a8e54819a1bd7f81a8c_1617689203853_default.sst",
      "total_kvs": 35,
      "total_bytes": 761167,
      "cf": "default",
      "size": 244471
    },
    {
      "sha256": "6dcb6ba2ff11f4e7db349effc98210ba372bebbf2470e6cd600ed5f2294330e7",
      "start_key": "7480000000000000ff3100000000000000f8",
      "end_key": "7480000000000000ff3300000000000000f8",
      "name": "1_50_25_2f1abd76c185ec355039f5b4a64f04637af91f80e6cb05099601ec6b9b1910e8_1617689203867_default.sst",
      "total_kvs": 22,
      "total_bytes": 1438283,
      "cf": "default",
      "size": 1284851
    },
    {
      "sha256": "ba603af7ecb2e21c8f145d995ae85eea3625480cd8186d4cffb53ab1974d8679",
      "start_key": "7480000000000000ff385f72ffffffffffffffffff0000000000fb",
      "name": "1_2_33_07b745c3d5a614ed6cc1cf21723b161fcb3e8e7d537546839afd82a4f392988c_1617689203895_default.sst",
      "total_kvs": 260000,
      "total_bytes": 114425025,
      "cf": "default",
      "size": 66048845
    }
  ],
  "raw_ranges": [
    {
      "cf": "default"
    }
  ],
  "cluster_id": 6946469498797568000,
  "cluster_version": "\"5.0.0-rc.x\"\n",
  "is_raw_kv": true,
  "br_version": "BR\nRelease Version: v5.0.0-master\nGit Commit Hash: c0d60dae4998cf9ac40f02e5444731c15f0b2522\nGit Branch: HEAD\nGo Version: go1.13.4\nUTC Build Time: 2021-03-25 08:10:08\nRace Enabled: false"
}`),
	[]byte(`{
    "files": [
      {
        "sha256": "3ae857ef9b379d498ae913434f1d47c3e90a55f3a4cd9074950bfbd163d5e5fc",
        "start_key": "7480000000000000115f720000000000000000",
        "end_key": "7480000000000000115f72ffffffffffffffff00",
        "name": "1_20_9_36adb8cedcd7af34708edff520499e712e2cfdcb202f5707dc9305a031d55a98_1675066275424_write.sst",
        "end_version": 439108573623222300,
        "crc64xor": 16261462091570213000,
        "total_kvs": 15,
        "total_bytes": 1679,
        "cf": "write",
        "size": 2514,
        "cipher_iv": "56MTbxA4CaNILpirKnBxUw=="
      }
    ],
    "schemas": [
      {
        "db": {
          "charset": "utf8mb4",
          "collate": "utf8mb4_bin",
          "db_name": {
            "L": "test",
            "O": "test"
          },
          "id": 1,
          "policy_ref_info": null,
          "state": 5
        }
      }
    ],
    "ddls": [],
    "cluster_id": 7194351714070942000,
    "cluster_version": "\"6.1.0\"\n",
    "br_version": "BR\nRelease Version: v6.1.0\nGit Commit Hash: 1a89decdb192cbdce6a7b0020d71128bc964d30f\nGit Branch: heads/refs/tags/v6.1.0\nGo Version: go1.18.2\nUTC Build Time: 2022-06-05 05:09:12\nRace Enabled: false",
    "end_version": 439108573623222300,
    "new_collations_enabled": "True"
  }`),
}

func TestEncodeAndDecode(t *testing.T) {
	for _, testMetaJSON := range testMetaJSONs {
		meta, err := UnmarshalBackupMeta(testMetaJSON)
		require.NoError(t, err)
		metaJSON, err := MarshalBackupMeta(meta)
		require.NoError(t, err)
		require.JSONEq(t, string(testMetaJSON), string(metaJSON))
	}
}
