# coding: utf-8

from ru.curs.celesta.score import ForeignKey, FKRule, IntegerColumn
from security.functions import Settings


def setForeignKeys(context):
    u"""функция устанавливает внешний ключ в таблицу subjects и меняет значение параметра isSystemInitialised на True
        Функция работает с метаданными челесты.
    """ 
    settings=Settings()
    celesta = context.getCelesta() #получаем объект celesta  
    score = celesta.getScore() #получаем объект score
    security_grain = score.getGrain('security') #получаем объект гранулы security
    subject_table=security_grain.getTable("subjects") #получаем объект таблицы subjects
    login_table=security_grain.getTable("logins") #получаем объект таблицы logins
    if settings.isUseAuthServer():
        # Если пользователи приходят из mellophone, поле password в таблице logins становится nullable.
        password_field = login_table.getColumn("password") #получаем объект поля password таблицы logins
        password_field.setNullableAndDefault(settings.isUseAuthServer(), None) #Разрешаем значения null для него
    if settings.isEmployees():
        employees_grain=score.getGrain(settings.getEmployeesParam("employeesGrain")) #получаем объект гранулы, которая содержит таблицу сотрудников
        employees_table=employees_grain.getTable(settings.getEmployeesParam("employeesTable")) #получаем объект таблицы сотрудников
        employees_id = employees_table.getColumn(settings.getEmployeesParam("employeesId")) #получаем объект колонки первичного ключа таблицы сотрудников
        if isinstance(employees_id, IntegerColumn):
            # если первичный ключ таблицы сотрудников целочисленный, удаляем колонку "employeeId" таблицы subjects 
            # и создаём новую целочисленного типа.
            # сделано так потому что по умолчанию поле "employeeId" таблицы subjects текстовое.
            subject_table.getColumn("employeeId").delete()
            IntegerColumn(subject_table, "employeeId")
        else:
            # если первичный ключ таблицы сотрудников текстовый, устанавливаем длину поля "employeeId" таблицы subjects
            # в соответствии с ним
            employees_id_length = employees_id.getLength()
            subject_table.getColumn("employeeId").setLength(unicode(employees_id_length))
        
        subjects_keys = subject_table.getForeignKeys() #получаем список объектов-внешних ключей таблицы subjects
        for subjects_key in subjects_keys:
            #удаляем все внешние ключи таблицы subjects
            subjects_key.delete()
        subjects_key = ForeignKey(subject_table, employees_table, ["employeeId"]) #создаём внешний ключ subjects(employeeId)-<employees>(<employeeId>)
        
    logins_keys = login_table.getForeignKeys() #получаем список объектов-внешних ключей таблицы logins
    for logins_key in logins_keys:
        #удаляем все внешние ключи таблицы logins
        logins_key.delete()                                
    logins_key = ForeignKey(login_table, subject_table, ["subjectId"]) #создаём внешний ключ logins(subjectId)-subjects(sid)
    if settings.loginIsSubject(): #устанавливаем правила удаления 
        # Если logins тождественны subjects:
        logins_key.setDeleteRule(FKRule.CASCADE) # каскадное удаление на ключ logins-subjecs
        if settings.isEmployees():
            subjects_key.setDeleteRule(FKRule.SET_NULL) # установка null на ключ subjects-<employees>
    else:
        logins_key.setDeleteRule(FKRule.SET_NULL) # установка null на ключ logins-subjecs
    score.save() #сохраняем изменения
    celesta.reInitialize() # реинициализируем челесту
    settings.setEmployeesParam("isSystemInitialised", "true") #меняем значение параметра, чтобы в следующий раз ключи уже не устанавливались.