// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

library crypto.base64;

import 'dart:convert';

import 'base64/decoder.dart';
import 'base64/encoder.dart';

/// An instance of the default implementation of [Base64Codec].
///
/// This provides convenient access to most common Base64 use-cases.
const Base64Codec BASE64 = const Base64Codec();

/// A codec that converts between binary data and [Base64][rfc]-encoded strings.
///
/// [rfc]: https://tools.ietf.org/html/rfc4648
class Base64Codec extends Codec<List<int>, String> {
  final bool _urlSafe;
  final bool _addLineSeparator;
  final bool _encodePaddingCharacter;

  /// Creates a new [Base64Codec].
  ///
  /// The default [BASE64] codec will be good enough for most cases. A new codec
  /// only needs to be instantiated when you want to do multiple conversions
  /// with the same configuration.
  ///
  /// If [urlSafe] is `true`, a URL-safe alphabet will be used when encoding.
  /// Specifically, the characters `-` and `_` will be used instead of `+` and
  /// `/`.
  ///
  /// If [addLineSeparator] is `true`, `\r\n` line separators will be added
  /// every 76 characters when encoding.
  ///
  /// If [encodePaddingCharacter] is `true`, the padding character `=` will be
  /// written as `%3D` when encoding.
  const Base64Codec(
      {bool urlSafe: false,
      bool addLineSeparator: false,
      bool encodePaddingCharacter: false})
      : _urlSafe = urlSafe,
        _addLineSeparator = addLineSeparator,
        _encodePaddingCharacter = encodePaddingCharacter;

  String get name => "base64";

  /// Encodes [bytes] into a Base64 string.
  ///
  /// If [urlSafe] is `true`, a URL-safe alphabet will be used when encoding.
  /// Specifically, the characters `-` and `_` will be used instead of `+` and
  /// `/`.
  ///
  /// If [addLineSeparator] is `true`, `\r\n` line separators will be added
  /// every 76 characters when encoding.
  ///
  /// If [encodePaddingCharacter] is `true`, the padding character `=` will be
  /// written as `%3D` when encoding.
  ///
  /// Any flags passed to this method take precedence over the flags passed to
  /// the codec itself.
  String encode(List<int> bytes,
      {bool urlSafe, bool addLineSeparator, bool encodePaddingCharacter}) {
    if (urlSafe == null) urlSafe = _urlSafe;
    if (addLineSeparator == null) addLineSeparator = _addLineSeparator;
    if (encodePaddingCharacter == null) {
      encodePaddingCharacter = _encodePaddingCharacter;
    }

    return new Base64Encoder(
        urlSafe: urlSafe,
        addLineSeparator: addLineSeparator,
        encodePaddingCharacter: encodePaddingCharacter).convert(bytes);
  }

  Base64Encoder get encoder => new Base64Encoder(
      urlSafe: _urlSafe,
      addLineSeparator: _addLineSeparator,
      encodePaddingCharacter: _encodePaddingCharacter);

  Base64Decoder get decoder => const Base64Decoder();
}
