//
// Copyright Amazon.com Inc. or its affiliates.
// All Rights Reserved.
//
// SPDX-License-Identifier: Apache-2.0
//
import Amplify
import AmplifyTestCommon

struct TestFlutterModelRegistration: AmplifyModelRegistration {
    var version: String = "1"
    private let decoder: (String, JSONDecoder?) throws -> Model = { (jsonString, decoder) -> Model in
        let resolvedDecoder: JSONDecoder
        if let decoder = decoder {
            resolvedDecoder = decoder
        } else {
            resolvedDecoder = JSONDecoder(dateDecodingStrategy: ModelDateFormatting.decodingStrategy)
        }
        // Convert jsonstring to object
        let data = jsonString.data(using: .utf8)!
        let jsonValue = try resolvedDecoder.decode(JSONValue.self, from: data)
        if case .array(let jsonArray) = jsonValue,
           case .object(let jsonObj) = jsonArray[0],
           case .string(let id) = jsonObj["id"] {
            let model = FlutterSerializedModel(id: id, map: jsonObj)
            return model
        }
        throw DataStoreError.decodingError(
            "Error in decoding \(jsonString)", "Please create an issue to amplify-flutter repo.")
    }
    func registerModels(registry: ModelRegistry.Type) {
        registry.register(modelType: Post.self, modelSchema: Post.schema, jsonDecoder: decoder)
        registry.register(modelType: Comment.self, modelSchema: Comment.schema, jsonDecoder: decoder)
        registry.register(modelType: Project1.self, modelSchema: Project1.schema, jsonDecoder: decoder)
        registry.register(modelType: Team1.self, modelSchema: Team1.schema, jsonDecoder: decoder)
        registry.register(modelType: Project2.self, modelSchema: Project2.schema, jsonDecoder: decoder)
        registry.register(modelType: Team2.self, modelSchema: Team2.schema, jsonDecoder: decoder)
        registry.register(modelType: Post3.self, modelSchema: Post3.schema, jsonDecoder: decoder)
        registry.register(modelType: Comment3.self, modelSchema: Comment3.schema, jsonDecoder: decoder)
        registry.register(modelType: Post4.self, modelSchema: Post4.schema, jsonDecoder: decoder)
        registry.register(modelType: Comment4.self, modelSchema: Comment4.schema, jsonDecoder: decoder)
        registry.register(modelType: Post5.self, modelSchema: Post5.schema, jsonDecoder: decoder)
        registry.register(modelType: PostEditor5.self, modelSchema: PostEditor5.schema, jsonDecoder: decoder)
        registry.register(modelType: User5.self, modelSchema: User5.schema, jsonDecoder: decoder)
        registry.register(modelType: Blog6.self, modelSchema: Blog6.schema, jsonDecoder: decoder)
        registry.register(modelType: Post6.self, modelSchema: Post6.schema, jsonDecoder: decoder)
        registry.register(modelType: Comment6.self, modelSchema: Comment6.schema, jsonDecoder: decoder)
        registry.register(modelType: ScalarContainer.self, modelSchema: ScalarContainer.schema, jsonDecoder: decoder)
        registry.register(modelType: ListIntContainer.self, modelSchema: ListIntContainer.schema, jsonDecoder: decoder)
        registry.register(modelType: ListStringContainer.self, modelSchema: ListStringContainer.schema, jsonDecoder: decoder)
        registry.register(modelType: EnumTestModel.self, modelSchema: EnumTestModel.schema, jsonDecoder: decoder)
        registry.register(modelType: NestedTypeTestModel.self, modelSchema: NestedTypeTestModel.schema, jsonDecoder: decoder)
        registry.register(modelType: CustomerOrder.self, modelSchema: CustomerOrder.schema, jsonDecoder: decoder)
    }
}