<?php
/**
 * webtrees: online genealogy
 * Copyright (C) 2018 webtrees development team
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
namespace Fisharebest\Webtrees\GedcomCode;

use Fisharebest\Webtrees\GedcomRecord;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Individual;

/**
 * Class GedcomCodeRela - Functions and logic for GEDCOM "RELA" codes
 */
class GedcomCodeRela {
	/** @var string[] List of possible values for the RELA tag */
	private static $TYPES = [
		'attendant', 'attending', 'best_man', 'bridesmaid', 'buyer',
		'circumciser', 'civil_registrar', 'employee', 'employer', 'foster_child',
		'foster_father', 'foster_mother', 'friend', 'godfather', 'godmother',
		'godparent', 'godson', 'goddaughter', 'godchild', 'guardian',
		'informant', 'lodger', 'nanny', 'nurse', 'owner',
		'priest', 'rabbi', 'registry_officer', 'seller', 'servant',
		'slave', 'ward', 'witness',
	];

	/**
	 * Translate a code, for an (optional) record.
	 * We need the record to translate the sex (godfather/godmother) but
	 * we won’t have this when adding data for new individuals.
	 *
	 * @param string            $type
	 * @param GedcomRecord|null $record
	 *
	 * @return string
	 */
	public static function getValue($type, GedcomRecord $record = null) {
		if ($record instanceof Individual) {
			$sex = $record->getSex();
		} else {
			$sex = 'U';
		}

		switch ($type) {
			case 'attendant':
				switch ($sex) {
					case 'M':
						return I18N::translateContext('MALE', 'Attendant');
					case 'F':
						return I18N::translateContext('FEMALE', 'Attendant');
					default:
						return I18N::translate('Attendant');
				}
			case 'attending':
				switch ($sex) {
					case 'M':
						return I18N::translateContext('MALE', 'Attending');
					case 'F':
						return I18N::translateContext('FEMALE', 'Attending');
					default:
						return I18N::translate('Attending');
				}
			case 'best_man':
				// always male
				return I18N::translate('Best man');
			case 'bridesmaid':
				// always female
				return I18N::translate('Bridesmaid');
			case 'buyer':
				switch ($sex) {
					case 'M':
						return I18N::translateContext('MALE', 'Buyer');
					case 'F':
						return I18N::translateContext('FEMALE', 'Buyer');
					default:
						return I18N::translate('Buyer');
				}
			case 'circumciser':
				// always male
				return I18N::translate('Circumciser');
			case 'civil_registrar':
				switch ($sex) {
					case 'M':
						return I18N::translateContext('MALE', 'Civil registrar');
					case 'F':
						return I18N::translateContext('FEMALE', 'Civil registrar');
					default:
						return I18N::translate('Civil registrar');
				}
			case 'employee':
				switch ($sex) {
					case 'M':
						return I18N::translateContext('MALE', 'Employee');
					case 'F':
						return I18N::translateContext('FEMALE', 'Employee');
					default:
						return I18N::translate('Employee');
				}
			case 'employer':
				switch ($sex) {
					case 'M':
						return I18N::translateContext('MALE', 'Employer');
					case 'F':
						return I18N::translateContext('FEMALE', 'Employer');
					default:
						return I18N::translate('Employer');
				}
			case 'foster_child':
				// no sex implied
				return I18N::translate('Foster child');
			case 'foster_father':
				// always male
				return I18N::translate('Foster father');
			case 'foster_mother':
				// always female
				return I18N::translate('Foster mother');
			case 'friend':
				switch ($sex) {
					case 'M':
						return I18N::translateContext('MALE', 'Friend');
					case 'F':
						return I18N::translateContext('FEMALE', 'Friend');
					default:
						return I18N::translate('Friend');
				}
			case 'godfather':
				// always male
				return I18N::translate('Godfather');
			case 'godmother':
				// always female
				return I18N::translate('Godmother');
			case 'godparent':
				switch ($sex) {
					case 'M':
						return I18N::translate('Godfather');
					case 'F':
						return I18N::translate('Godmother');
					default:
						return I18N::translate('Godparent');
				}
			case 'godson':
				// always male
				return I18N::translate('Godson');
			case 'goddaughter':
				// always female
				return I18N::translate('Goddaughter');
			case 'godchild':
				switch ($sex) {
					case 'M':
						return I18N::translate('Godson');
					case 'F':
						return I18N::translate('Goddaughter');
					default:
						return I18N::translate('Godchild');
				}
			case 'guardian':
				switch ($sex) {
					case 'M':
						return I18N::translateContext('MALE', 'Guardian');
					case 'F':
						return I18N::translateContext('FEMALE', 'Guardian');
					default:
						return I18N::translate('Guardian');
				}
			case 'informant':
				switch ($sex) {
					case 'M':
						return I18N::translateContext('MALE', 'Informant');
					case 'F':
						return I18N::translateContext('FEMALE', 'Informant');
					default:
						return I18N::translate('Informant');
				}
			case 'lodger':
				switch ($sex) {
					case 'M':
						return I18N::translateContext('MALE', 'Lodger');
					case 'F':
						return I18N::translateContext('FEMALE', 'Lodger');
					default:
						return I18N::translate('Lodger');
				}
			case 'nanny':
				// no sex implied
				return I18N::translate('Nanny');
			case 'nurse':
				switch ($sex) {
					case 'M':
						return I18N::translateContext('MALE', 'Nurse');
					case 'F':
						return I18N::translateContext('FEMALE', 'Nurse');
					default:
						return I18N::translate('Nurse');
				}
			case 'owner':
				switch ($sex) {
					case 'M':
						return I18N::translateContext('MALE', 'Owner');
					case 'F':
						return I18N::translateContext('FEMALE', 'Owner');
					default:
						return I18N::translate('Owner');
				}
			case 'priest':
				// no sex implied
				return I18N::translate('Priest');
			case 'rabbi':
				// always male
				return I18N::translate('Rabbi');
			case 'registry_officer':
				switch ($sex) {
					case 'M':
						return I18N::translateContext('MALE', 'Registry officer');
					case 'F':
						return I18N::translateContext('FEMALE', 'Registry officer');
					default:
						return I18N::translate('Registry officer');
				}
			case 'seller':
				switch ($sex) {
					case 'M':
						return I18N::translateContext('MALE', 'Seller');
					case 'F':
						return I18N::translateContext('FEMALE', 'Seller');
					default:
						return I18N::translate('Seller');
				}
			case 'servant':
				switch ($sex) {
					case 'M':
						return I18N::translateContext('MALE', 'Servant');
					case 'F':
						return I18N::translateContext('FEMALE', 'Servant');
					default:
						return I18N::translate('Servant');
				}
			case 'slave':
				switch ($sex) {
					case 'M':
						return I18N::translateContext('MALE', 'Slave');
					case 'F':
						return I18N::translateContext('FEMALE', 'Slave');
					default:
						return I18N::translate('Slave');
				}
			case 'ward':
				switch ($sex) {
					case 'M':
						return I18N::translateContext('MALE', 'Ward');
					case 'F':
						return I18N::translateContext('FEMALE', 'Ward');
					default:
						return I18N::translate('Ward');
				}
			case 'witness':
				// Do we need separate male/female translations for this?
				return I18N::translate('Witness');
			default:
				return I18N::translate($type);
		}
	}

	/**
	 * A list of all possible values for RELA
	 *
	 * @param GedcomRecord|null $record
	 *
	 * @return string[]
	 */
	public static function getValues(GedcomRecord $record = null) {
		$values = [];
		foreach (self::$TYPES as $type) {
			$values[$type] = self::getValue($type, $record);
		}
		uasort($values, '\Fisharebest\Webtrees\I18N::strcasecmp');

		return $values;
	}
}
