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

var htmlEncode = require('htmlencode').htmlEncode;

function text(plainText) {
  return htmlEncode(plainText);
}

function link(name, linkText) {
  return '<a name="' + name + '" href="#">' + text(linkText) + '</a>';
}

function pre(preText) {
  return '<pre>' + preText + '</pre>';
}

function ownerOfTrip(sender, owner) {
  return sender === owner? 'a' : owner + '\'s';
}

function getStrings(locale) {
  return {
    'Add destination': 'Add destination',
    add: function(object) {
      return 'Add ' + object.toLowerCase();
    },
    notCastable: function(feature) {
      return 'The ' + feature + ' feature is not castable.';
    },
    castingTooltip: 'To cast a panel to a nearby device, middle-click and ' +
      'drag (or left-right-click and drag) the panel towards the target ' +
      'device.',
    change: function(object) {
      return 'Change ' + object.toLowerCase();
    },
    'Connected to all services.': 'Connected to all services.',
    'Connecting...': 'Connecting...',
    'Destination': 'Destination',
    destination: function(n) {
      return 'Destination ' + n;
    },
    DirectionsStatus: {
      NOT_FOUND: 'Location not found',
      ZERO_RESULTS: 'No route to destination',
      MAX_WAYPOINTS_EXCEEDED: 'Maximum number of waypoints exceeded',
      OVER_QUERY_LIMIT: 'Request rate exceeded',
      REQUEST_DENIED: 'Request denied',
      UNKNOWN_ERROR: 'Server error'
    },
    'Final destination': 'Final destination',
    'Free': 'Free',
    label: function(label, details) {
      return label + ': ' + details;
    },
    invitationAccepted: function(sender, owner) {
      return 'Accepted invite from ' + sender + ' to join ' +
        ownerOfTrip(sender, owner) + ' trip.';
    },
    invitationDeclined: function(sender, owner) {
      return 'Declined invite from ' + sender + ' to join ' +
        ownerOfTrip(sender, owner) + ' trip.';
    },
    invitationDismissed: function(sender, owner) {
      return sender + ' has invited you to join ' + ownerOfTrip(sender, owner) +
        ' trip. (Expired)';
    },
    invitationReceived: function(sender, owner) {
      return text(sender + ' has invited you to join ' +
        ownerOfTrip(sender, owner) + ' trip. ') +
        link('accept', 'Accept') + text(' / ') + link('decline', 'Decline');
    },
    invitationSent: function(recipient, sender) {
      return sender?
        sender + ' invited ' + recipient + ' to join the trip.' :
        'Invited ' + recipient + ' to join the trip.';
    },
    noNearbyDevices: 'Cannot cast: no nearby devices.',
    'Not connected': 'Not connected',
    notReachable: function(username) {
      return username + ' is not reachable or is not a Travel Planner user.';
    },
    'Origin': 'Origin',
    priceLevelUnit: '$',
    'Search': 'Search',
    sendingInvite: function(username) {
      return 'Inviting ' + username + ' to join the trip...';
    },
    status: function(status) {
      return text('Status: ') + pre(status);
    },
    'Timeline': 'Timeline',
    'Travel Planner': 'Travel Planner',
    'Trip is still initializing.' : 'Trip is still initializing.',
    'Unknown error': 'Unknown error'
  };
}

getStrings.currentLocale = getStrings();

module.exports = getStrings;