# -*- coding: utf-8 -*-
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2003-2005  Donald N. Allingham
# Copyright (C) 2008       Brian G. Matherly
# Copyright (C) 2009-2010  Andrew I Baznikin
#
# 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 2 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, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#

# Written by Alex Roitman, largely based on relationship.py by Don Allingham.
"""
Russian-specific definitions of relationships
"""

#-------------------------------------------------------------------------
#
# GRAMPS modules
#
#-------------------------------------------------------------------------

from gramps.gen.lib import Person
import gramps.gen.relationship

#-------------------------------------------------------------------------

_parents_level = [
  "",
  "родители",
  "дедушки/бабушки",
  "прадедушки/прабабушки",
  "прапрадедушки/прапрабабушки (5 поколение)",
  "прапрапрадедушки/прапрапрабабушки (6 поколение)",
  "прапрапрапрадедушки/прапрапрапрабабушки (7 поколение)",
  "прапрапрапрапрадедушки/прапрапрапрапрабабушки (8 поколение)",
  ]

_male_cousin_level = [ 
  "", 
  "двоюродный", 
  "троюродный", 
  "четвероюродный",
  "пятиюродный", 
  "шестиюродный", 
  "семиюродный", 
  "восьмиюродный",
  "девятиюродный", 
  "десятиюродный", 
  "одиннацатиюродный", 
  "двенадцатиюродный", 
  "тринадцатиюродный", 
  "четырнадцатиюродный", 
  "пятнадцатиюродный", 
  "шестнадцатиюродный", 
  "семнадцатиюродный", 
  "восемнадцатиюродный", 
  "девятнадцатиюродный", 
  "двадцатиюродный", 
  ]

_female_cousin_level = [ 
  "", 
  "двоюродная", 
  "троюродная", 
  "четвероюродная",
  "пятиюродная", 
  "шестиюродная", 
  "семиюродная", 
  "восьмиюродная",
  "девятиюродная", 
  "десятиюродная", 
  "одиннацатиюродная", 
  "двенадцатиюродная", 
  "тринадцатиюродная", 
  "четырнадцатиюродная", 
  "пятнадцатиюродная", 
  "шестнадцатиюродная", 
  "семнадцатиюродная", 
  "восемнадцатиюродная", 
  "девятнадцатиюродная", 
  "двадцатиюродная", 
  ]

_cousin_level = [ 
  "",
  "двоюродные", 
  "троюродные", 
  "четвероюродные",
  "пятиюродные", 
  "шестиюродные", 
  "семиюродные", 
  "восьмиюродные",
  "девятиюродные", 
  "десятиюродные",
  "одиннацатиюродные", 
  "двенадцатиюродные",
  "тринадцатиюродные", 
  "четырнадцатиюродные", 
  "пятнадцатиюродные", 
  "шестнадцатиюродные", 
  "семнадцатиюродные", 
  "восемнадцатиюродные", 
  "девятнадцатиюродные", 
  "двадцатиюродные", 
  ]

_junior_male_removed_level = [ 
  "брат", 
  "племянник", 
  "внучатый племянник", 
  "правнучатый племянник", 
  "праправнучатый племянник", 
  "прапраправнучатый племянник", 
  "прапрапраправнучатый племянник", 
  ]

_junior_female_removed_level = [ 
  "сестра", 
  "племянница", 
  "внучатая племянница", 
  "правнучатая племянница", 
  "праправнучатая племянница", 
  "прапраправнучатая племянница", 
  "прапрапраправнучатая племянница", 
  ]

_juniors_removed_level = [ 
  "братья/сестры", 
  "племянники", 
  "внучатые племянники", 
  "правнучатые племянники", 
  "праправнучатые племянники", 
  "прапраправнучатые племянники", 
  "прапрапраправнучатые племянники", 
  ]

_senior_male_removed_level = [ 
  "", 
  "дядя", 
  "дед", 
  "прадед", 
  "прапрадед", 
  "прапрапрадед", 
  "прапрапрапрадед", 
  ]

_senior_female_removed_level = [ 
  "", 
  "тётя", 
  "бабушка", 
  "прабабушка", 
  "прапрабабушка", 
  "прапрапрабабушка", 
  "прапрапрапрабабушка", 
  ]

_seniors_removed_level = [ 
  "", 
  "дяди/тёти", 
  "дедушки/бабушки", 
  "прадеды/прабабушки", 
  "прапрадеды/прапрабабушки", 
  "прапрапрадеды/прапрапрабабушки", 
  "прапрапрапрадеды/прапрапрапрабабушки", 
  ]

_father_level = [ 
  "", 
  "отец", 
  "дед", 
  "прадед", 
  "прапрадед", 
  "прапрапрадед", 
  "прапрапрапрадед", 
  ]

_mother_level = [ 
   "", 
   "мать", 
   "бабушка", 
   "прабабушка", 
   "прапрабабушка", 
   "прапрапрабабушка", 
   "прапрапрапрабабушка", 
   ]

_son_level = [ 
  "", 
  "сын", 
  "внук", 
  "правнук", 
  "праправнук", 
  "прапраправнук", 
  "прапрапраправнук", 
  ]

_daughter_level = [ 
  "", 
  "дочь", 
  "внучка", 
  "правнучка", 
  "праправнучка", 
  "прапраправнучка", 
  "прапрапраправнучка", 
  ]

_children_level = [ 
 "", 
 "дети", 
 "внуки", 
 "правнуки", 
 "праправнуки", 
 "прапраправнуки", 
 "прапрапраправнуки", 
 "прапрапрапраправнуки",
 ]

_sister_level = [ 
  "", 
  "сестра", 
  "тётя", 
  "двоюродная бабушка", 
  "двоюродная прабабушка", 
  "двоюродная прапрабабушка", 
  "двоюродная прапрапрабабушка", 
  "двоюродная прапрапрапрабабушка", 
  ]

_brother_level = [ 
  "", 
  "брат", 
  "дядя", 
  "двоюродный дед", 
  "двоюродный прадед", 
  "двоюродный прапрадед", 
  "двоюродный прапрапрадед", 
  "двоюродный прапрапрапрадед", 
  ]

_siblings_level = [ 
  "", 
  "братья/сестры", 
  "дядьки/тётки", 
  "двоюродные дедушки/бабушки", 
  "двоюродные прадедушки/прабабушки", 
  "двоюродные прапрадедушки/прапрабабушки (5 поколение)", 
  "двоюродные прапрапрадедушки/прапрапрабабушки (6 поколение)",
  "двоюродные прапрапрапрадедушки/прапрапрапрабабушки (7 поколение)",
  "двоюродные прапрапрапрапрадедушки/прапрапрапрапрабабушки (8 поколение)",
  ]

_nephew_level = [ 
  "", 
  "племянник", 
  "внучатый племянник", 
  "правнучатый племянник", 
  "праправнучатый племянник", 
  "прапраправнучатый племянник", 
  "прапрапраправнучатый племянник", 
  ]

_niece_level = [ 
  "", 
  "племянница", 
  "внучатая племянница", 
  "правнучатая племянница", 
  "праправнучатая племянница", 
  "прапраправнучатая племянница", 
  "прапрапраправнучатая племянница", 
  ]

_nephews_nieces_level = [
  "", 
  "братья/сестры", 
  "племянники", 
  "внучатые племянники", 
  "правнучатые племянники", 
  "праправнучатые племянники", 
  "прапраправнучатые племянники", 
  "прапрапраправнучатые племянники", 
  ]

#-------------------------------------------------------------------------
#
#
#
#-------------------------------------------------------------------------
class RelationshipCalculator(gramps.gen.relationship.RelationshipCalculator):
    """
    RelationshipCalculator Class
    """

    def __init__(self):
        gramps.gen.relationship.RelationshipCalculator.__init__(self)

    def get_parents(self, level):
        if level > len(_parents_level)-1:
            return "дальние родственники"
        else:
            return _parents_level[level]

    def get_junior_male_cousin(self, level, removed):
        if removed > len(_junior_male_removed_level)-1 or \
        level > len(_male_cousin_level)-1:
            return "дальний родственник"
        else:
            return "%s %s" % (_male_cousin_level[level], _junior_male_removed_level[removed])

    def get_senior_male_cousin(self, level, removed):
        if removed > len(_senior_male_removed_level)-1 or \
        level > len(_male_cousin_level)-1:
            return "дальний родственник"
        else:
            return "%s %s" % (_male_cousin_level[level], _senior_male_removed_level[removed])

    def get_junior_female_cousin(self, level, removed):
        if removed > len(_junior_female_removed_level)-1 or \
        level > len(_male_cousin_level)-1:
            return "дальняя родственница"
        else:
            return "%s %s" % (_female_cousin_level[level], _junior_female_removed_level[removed])

    def get_senior_female_cousin(self, level, removed):
        if removed > len(_senior_female_removed_level)-1 or \
        level > len(_male_cousin_level)-1:
            return "дальняя родственница"
        else:
            return "%s %s" % (_female_cousin_level[level], _senior_female_removed_level[removed])

    def get_father(self, level):
        if level > len(_father_level)-1:
            return "дальний предок"
        else:
            return _father_level[level]

    def get_son(self, level):
        if level > len(_son_level)-1:
            return "дальний потомок"
        else:
            return _son_level[level]

    def get_mother(self, level):
        if level > len(_mother_level)-1:
            return "дальний предок"
        else:
            return _mother_level[level]

    def get_daughter(self, level):
        if level > len(_daughter_level)-1:
            return "дальний потомок"
        else:
            return _daughter_level[level]

    def _get_aunt(self, level, step='', inlaw=''):
        if level > len(_sister_level)-1:
            return "дальний предок в соседнем поколении"
        else:
            return _sister_level[level]

    def _get_uncle(self, level, step='', inlaw=''):
        if level > len(_brother_level)-1:
            return "дальний предок в соседнем поколении"
        else:
            return _brother_level[level]

    def _get_sibling(self, level, step='', inlaw=''):
        """
        Sibling of unknown gender
        """
        return self._get_uncle(level, step, inlaw) + " или " + self._get_aunt(level, step, inlaw)

    def get_nephew(self, level):
        if level > len(_nephew_level)-1:
            return "дальний потомок в соседнем поколении"
        else:
            return _nephew_level[level]

    def get_niece(self, level):
        if level > len(_niece_level)-1:
            return "дальний потомок в соседнем поколении"
        else:
            return _niece_level[level]

    def get_single_relationship_string(self, Ga, Gb, gender_a, gender_b,
                                       reltocommon_a, reltocommon_b,
                                       only_birth=True, 
                                       in_law_a=False, in_law_b=False):

        if Gb == 0:
            if Ga == 0:
                return ('один человек')
            elif gender_b == Person.MALE:
                return (self.get_father(Ga))
            else:
                return (self.get_mother(Ga))
        elif Ga == 0:
            if gender_b == Person.MALE:
                return (self.get_son(Gb))
            else:
                return (self.get_daughter(Gb))
        elif Gb == 1:
            if gender_b == Person.MALE:
                return (self._get_uncle(Ga))
            else:
                return (self._get_aunt(Ga))
        elif Ga == 1:
            if gender_b == Person.MALE:
                return (self.get_nephew(Gb-1))
            else:
                return (self.get_niece(Gb-1))
        elif Ga > Gb:
            if gender_b == Person.MALE:
                return (self.get_senior_male_cousin(Gb-1, Ga-Gb))
            else:
                return (self.get_senior_female_cousin(Gb-1, Ga-Gb))
        else:
            if gender_b == Person.MALE:
                return (self.get_junior_male_cousin(Ga-1, Gb-Ga))
            else:
                return (self.get_junior_female_cousin(Ga-1, Gb-Ga))


    def get_plural_relationship_string(self, Ga, Gb,
                                       reltocommon_a='', reltocommon_b='',
                                       only_birth=True,
                                       in_law_a=False, in_law_b=False):
        rel_str = "дальние родственники"
        if Ga == 0:
            # These are descendants
            if Gb < len(_children_level):
                rel_str = _children_level[Gb]
            else:
                rel_str = "дальние потомки"
        elif Gb == 0:
            # These are parents/grand parents
            if Ga < len(_parents_level):
                rel_str = _parents_level[Ga]
            else:
                rel_str = "дальние предки"
        elif Gb == 1:
            # These are siblings/aunts/uncles
            if Ga < len(_siblings_level):
                rel_str = _siblings_level[Ga]
            else:
                rel_str = "дальние дяди/тёти"
        elif Ga == 1:
            # These are nieces/nephews
            if Gb < len(_nephews_nieces_level):
                rel_str = _nephews_nieces_level[Gb]
            else:
                rel_str = "дальние племянники/племянницы"
        elif Ga > Gb:
            # These are cousins in different generations with the second person 
            # being in a higher generation from the common ancestor than the 
            # first person.
            if Gb <= len(_seniors_removed_level) and (Ga-Gb) < len(_cousin_level):
                rel_str = "%s %s" % ( _cousin_level[Gb-1], 
                                                  _seniors_removed_level[Ga-Gb] )
            else:
                rel_str =  "(старшие) дальние родственники"
        else:
            # These are cousins in different generations with the second person 
            # being in a lower generation from the common ancestor than the 
            # first person.
            if Ga <= len(_juniors_removed_level) and (Gb-Ga) < len(_cousin_level):
                rel_str = "%s %s" % ( _cousin_level[Ga-1], 
                                                    _juniors_removed_level[Gb-Ga] )
            else:
                rel_str =  "(младшие) дальние родственники"
                
        if in_law_b == True:
            # TODO: Translate this!
            rel_str = "spouses of %s" % rel_str
                
        return rel_str

# TODO: def get_sibling_relationship_string for Russian step and inlaw relations

if __name__ == "__main__":

    # Test function. Call it as follows from the command line (so as to find
    #        imported modules):
    #    export PYTHONPATH=/path/to/gramps/src
    # python src/plugins/rel/rel_ru.py
    # (Above not needed here)

    """TRANSLATORS, copy this if statement at the bottom of your 
        rel_xx.py module, and test your work with:
        python src/plugins/rel/rel_xx.py
    """
    from gramps.gen.relationship import test
    RC = RelationshipCalculator()
    test(RC, True)
