// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:convert';

import 'package:lib.app.dart/logging.dart';

import '../entity_codec.dart';
import 'email_entity_data.dart';

const String _kType = 'com.fuchsia.contact.email';

/// The [EntityCodec] that translates the [EmailEntityData].
class EmailEntityCodec extends EntityCodec<EmailEntityData> {
  /// Constructor
  EmailEntityCodec()
      : super(
          type: _kType,
          encode: _encode,
          decode: _decode,
        );
}

/// Encodes [EmailEntityData] into a [String].
String _encode(EmailEntityData email) {
  assert(email != null);

  return json.encode(<String, String>{
    'label': email.label,
    'value': email.value,
  });
}

/// Decodes [String] into a structured [EmailEntityData].
EmailEntityData _decode(String data) {
  assert(data != null);
  assert(data.isNotEmpty);
  try {
    Map<String, String> decodedJson = json.decode(data);
    return EmailEntityData(
      value: decodedJson['value'],
      label: decodedJson['label'] ?? '',
    );
  } on Exception catch (e) {
    // since this is just a first pass, not really going to do too much
    // additional validation here but would like to know if this ever does
    // error out
    log.warning('$_kType entity error when decoding from json string: $json'
        '\nerror: $e');
    rethrow;
  }
}
