<?
include_once(_DIR_EXT.'/HTML/c_page_XML_AJAX.php') ;

class c_page_ajax extends c_page_XML_AJAX
{

    function check_member()
      { // только в этом ext не проверять авторизацию
        //if (!MEMBER()->id) { $this->add_element('go_url','/cab/') ; return(0) ; }
        return(1) ;
      }

    public function get_group()
    {
        $group_name = isset($_POST['group_name']) ? $_POST['group_name'] : null;
        if (empty($group_name)) {
            $this->add_element('show_notife', 'Введите название группы');
            return;
        }
	    $html='' ;
        $groups = AD()->find_groups($group_name);
        if (count($groups)) {
            $html .= '<table class="basic fz_small">'
                   . ' <tr><th>Группа AD</th><th>Группа ЭСМО</th><th>Роль ЭСМО</th><th></th></tr></tr>';

            $group_ids = [];
            foreach ($groups as $group) {
                $group_ids[] = "'".$group->get('guid')."'";
            }

            $items = execSQL("SELECT arr_name, personal_id, group_id FROM view_IL_ad_groups WHERE (group_id > 0 OR personal_id > 0) AND arr_name IN (".implode(',', $group_ids).")");

            $registered_groups = [];

            foreach ($items as $item) {
                $registered_groups[$item['arr_name']] = [
                    'group_id' => $item['group_id'],
                    'role_id' => $item['personal_id'],
                ];
            }

            $esmo_groups = execSQL('SELECT pkey, obj_name FROM obj_site_account WHERE enabled=1 AND clss in (1,206) AND parent != 0');

            foreach ($groups as $group) {
                $parts = explode(',', $group);
                $name = explode('=', $parts[0])[1];
                $guid = $group->get('guid');
                $create = !isset($registered_groups[$guid]);

                $group_select = '<select data-guid="'.$guid.'" style="width:200px;" class="ad-group-select form-control"><option value="0">-</option>';
                foreach ($esmo_groups as $esmo_group) {
                    $selected = isset($registered_groups[$guid]) && $registered_groups[$guid]['group_id'] == $esmo_group['pkey'] ? 'selected': '';
                    $group_select .= '<option value="'.$esmo_group['pkey'].'" '.$selected.'>'.$esmo_group['obj_name'].'</option>';
                }
                $group_select .= '</select>';

                $html .= '<tr>'
                      .'<td><a href="#" class="v2" cmd="AD/get_users" name="'.$name.'">'.$name.'</a></td>'
                      .'<td style="text-align: left">'.$group_select.'</td>';

                $html .= '<td style="text-align: left">'
                      .'<select style="width:200px;" class="ad-role-select form-control" data-guid="'.$guid.'"><option value="0">-</option>';

                $user_roles = $_SESSION['ARR_roll'];
                foreach ($user_roles as $role_id => $role) {
                    $selected = isset($registered_groups[$guid]) && $registered_groups[$guid]['role_id'] == $role_id ? 'selected': '';
                    $html .= '<option value="'.$role_id.'" '.$selected.'>'.$role['obj_name'].'</option>';
                }

                $html .= '</select></td>';
                $html .= '<td id="group_'.$guid.'"><button id="save_'.$guid.'" class="v2" cmd="AD/save_group" guid="'.$guid.'" group_name="'.$name.'" create="'.$create.'" >Сохранить</button></td>';
                $html .= '</tr>';
            }
        } else {
            $this->add_element('show_notife', 'Группы не найдены');
        }
        $this->add_element('group_data.HTML', $html) ;
    }

    public function get_users()
    {
        $group_name = isset($_POST['name']) ? $_POST['name'] : null;
	    $html='' ;
        if ($group_name) {
            $user_dns = AD()->get_group_members($group_name);

            $html .= '<table class="basic fz_small" style="width: 100%">'
                  .  '<tr><th>Логин</th><th>ФИО</th><th>Группа ЭСМО</th><th>Роль ЭСМО</th></tr></tr>';
            $user_roles = $_SESSION['ARR_roll'];

            foreach ($user_dns as $dn) {
                $user_info = AD()->get_user_by_dn($dn);
                $account = execSQL_van("select login, rol, group_id from obj_site_account where login='".$user_info['username']."'");
                $esmo_group_id = isset($account['group_id']) ? $account['group_id'] : null;
                $role_id = isset($account['rol']) ? $account['rol'] : null;

                if ($esmo_group_id) {
                    $esmo_group = execSQL_van("select obj_name from obj_site_account where pkey=".$esmo_group_id);
                }

                $esmo_group_name = isset($esmo_group['obj_name']) ? $esmo_group['obj_name'] : '-';
                $esmo_role_name = $role_id ? $user_roles[$role_id]['obj_name'] : '-';

                if ($user_info) {
                    $html .= '<tr><td>'.$user_info['username'].'</td><td>'.$user_info['fullName'].'</td><td>'.$esmo_group_name.'</td><td>'.$esmo_role_name.'</td>';
                }
            }

            $html .= "</table>";
            echo $html;
            $this->add_element('show_modal_window',HTML,array('title'=>'Пользователи в группе '.$group_name));
        } else {
            $this->add_element('show_notife', 'Не выбрана группа');
        }
    }

    public function save_group()
    {   $arr_changes=array() ;
        $guid = isset($_POST['guid']) ? $_POST['guid'] : null;
        $group_name = isset($_POST['group_name']) ? $_POST['group_name'] : null;
        $role_id = isset($_POST['role_id']) ? $_POST['role_id'] : 0;
        $esmo_group_id = isset($_POST['group_id']) ? $_POST['group_id'] : 0;

        $arr_ESMO_roll=$_SESSION['ARR_roll'] ;
	    $arr_ESMO_group=execSQL_row('select pkey,obj_name from obj_site_account where clss in (1,206) order by clss,obj_name') ;


        if ($guid && $group_name)
        {   $group_id=_IL('IL_ad_groups')->get_id_of_value($group_name) ;
	    // если группы $group_name еще нет в списке - добавить в список
            if (!$group_id)
            {   _IL('IL_ad_groups')->append_rec_to_list(array('obj_name'=>$group_name,'arr_name'=>$guid),array('debug'=>0)) ;
                $group_id=_IL('IL_ad_groups')->get_id_of_value($group_name) ;
            }
	        if ($group_id)
	        {   $cur_rec=execSQL_van('select * from view_IL_ad_groups where id='.$group_id) ;
	            if ($cur_rec['personal_id']!=$role_id)
	            {   $old_ESMO_rol_id=execSQL_value('select personal_id from view_IL_ad_groups where id='.$group_id) ;
		            $arr_changes[]='Группа AD "<strong>'.$cur_rec['obj_name'].'</strong>", роль ЭСМО: <strong>'.$arr_ESMO_roll[$old_ESMO_rol_id]['obj_name'].'</strong> => <strong>'.$arr_ESMO_roll[$role_id]['obj_name'].'</strong> - <span class="green">OK</span>' ;
	                execSQL_update('update view_IL_ad_groups set personal_id='.$role_id.' where id='.$group_id) ;
            }

	            if ($cur_rec['group_id']!=$esmo_group_id)
	            {   $old_ESMO_group_id=execSQL_value('select group_id from view_IL_ad_groups where id='.$group_id) ;
		            $arr_changes[]='Группа AD "<strong>'.$cur_rec['obj_name'].'</strong>", группа ЭСМО: <strong>'.$arr_ESMO_group[$old_ESMO_group_id].'</strong> => <strong>'.$arr_ESMO_group[$esmo_group_id].'</strong> - <span class="green">OK</span>' ;
	                execSQL_update('update view_IL_ad_groups set group_id='.$esmo_group_id.' where id='.$group_id) ;
            }
        }
    }

        //damp_array($_POST) ;
		 if (_sizeof($arr_changes))
	     {   ob_start() ;
	     	 echo implode('<br>',$arr_changes) ;
	     	 $text=ob_get_clean() ;
	     	 echo $text ;
		     ?><br><br><div class="center"><button class="cancel">Закрыть</button></div><?
	     	 LOGS()->reg_log('AD_change_group',$text) ;
	         $this->add_element('show_modal_window','HTML',array('title'=>'Настройки групп AD','_after_close_update_page'=>1,'width'=>'500px')) ;
	     }
	     else $this->add_element('show_notife','Изменений не обнаружено',array('color'=>'yellow')) ;
    }

    public function save_user()
    {
        $uid = isset($_POST['uid']) ? $_POST['uid'] : null;
        $login = isset($_POST['user_name']) ? $_POST['user_name'] : null;
        $dn = isset($_POST['dn']) ? $_POST['dn'] : null;
        $role_id = isset($_POST['role_id']) ? $_POST['role_id'] : null;
        $group_id = isset($_POST['group_id']) ? $_POST['group_id'] : null;

        if ($uid) { // Пользователь уже существует
            $user = ACCOUNTS()->get_member_by_id($uid);

            // Нет пользователя с таким ID. Где-то косяк. Так и скажем об этом
            if (!$user) {
                $this->add_element('show_notife', 'Пользователь с ID ' . $uid . ' не найден');
                return;
            }

            // Изменилась роль
            if ($role_id !== null) {
                $user['rol'] = $role_id;
            }

            // Изменилась группа
            if ($group_id !== null) {
                $user['group_id'] = $group_id;
                $user['parent'] = $group_id;
            }

                ACCOUNTS()->member_save($user['pkey'], $user);

            $this->add_element('show_notife', 'Изменения сохранены');
        } else { // Пользователя нет на сервере. Создаем нового
            // Сперва проверим, что были указаны и группа и роль
            if(!$group_id) {
                $this->add_element('show_notife', 'Необходимо выбрать ГРУППУ для пользователя');
                return;
            }
            if(!$role_id) {
                $this->add_element('show_notife', 'Необходимо выбрать РОЛЬ для пользователя');
                return;
            }

            // Если вдруг неведомым чудом сюда приходит пользователь без логина или dn-a
            if(!$login || !$dn) {
                $this->add_element('show_notife', 'Не указан ЛОГИН или DN пользователя');
                return;
            }

            $ad_user = AD()->get_user_by_dn($dn);
            $account_data = array('login'=>$login, 'rol'=>$role_id, 'group_id'=>$group_id, 'parent'=>$group_id, 'name'=>$ad_user['fullName'],'UID'=>$ad_user['guid'],'ext_info'=>array('AD_group'=>AD()->get_AD_member_groups($login)));
            // Приоритет: 1) LS_AD_working_name_for_rol для роли 2, 2) working из роли
            if ($role_id == 2 && $GLOBALS['LS_AD_working_name_for_rol']) {
                $account_data['working'] = $GLOBALS['LS_AD_working_name_for_rol'];
            } elseif (isset($_SESSION['ARR_roll'][$role_id]['working']) && $_SESSION['ARR_roll'][$role_id]['working']) {
                $account_data['working'] = $_SESSION['ARR_roll'][$role_id]['working'];
            }
            $result = ACCOUNTS()->account_create($account_data);

            if(array_key_exists('error', $result) && $result['error'] != '') {
                $this->add_element('show_notife', 'Ошибка: ' . $result['error']);
                return;
            }

            $this->add_element('show_notife', 'Пользователь создан');
            return;
        }
    }

    function search_user()
    {
        $login = isset($_POST['search-login']) ? $_POST['search-login'] : null;
        if(empty($login)) {
            $this->add_element('show_notife', 'Укажите логин пользователя');
            $this->add_element('user_info.HTML', '') ;
            return;
        }

        $users = AD()->find_users($login);

        // Пользователи не найдены
        if(!count($users)) {
            $this->add_element('show_notife', 'Пользователи не найдены');
            $this->add_element('user_info.HTML', '') ;
            return;
        }

        $html = '<hr><h2>Пользователей найдено: ' . count($users);
        $html .= '</h2>';
        $html .= '<table class="basic fz_small">';
        $html .= '<thead><tr><th>#</th><th>Логин</th><th>ФИО</th><th>Группы AD</th><th>Группа ЭСМО</th><th>Роль ЭСМО</th><th></th></tr></thead><tbody>';

        // Список групп сервера
        $esmo_groups = execSQL('SELECT pkey, obj_name FROM obj_site_account WHERE enabled=1 AND clss in (1,206) AND parent != 0');

        $i = 0;

        foreach ($users as $user) {
            $i++;
            $site_user = ACCOUNTS()->get_member_by_login($user->username);

            if(empty($site_user)) {
                $create = 1;
                $site_user = array(
                    'group' => ''
                );
            } else {
                $create = 0;
                $site_user['group'] = $esmo_groups[$site_user['parent']]['obj_name'];
            }
            $ad_groups = AD()->get_AD_member_groups($user->username);
            $html .= '<tr>
                <td>'.$i.'</td>
                <td>'.$user->username.'</td>
                <td>' . ($user->has('lastName') ? $user->lastName : '' ) . ' ' . ( $user->has('firstName') ? $user->firstName : '' ) . '</td>
                <td>';

            // Группы в AD
            if(count($ad_groups)) {
                foreach($ad_groups as $g => $name) {
                    $html .= $name . '<br />';
                }
            }
            $html .= '</td>';

            // Группа ЭСМО
            $html .= '<td style="text-align: left">'
                .'<select style="width:200px;" class="ad-group-select form-control" data-uid="'.$site_user['pkey'].'" data-guid="'.$user->guid.'"><option value="0">-</option>';

            $group_id = $site_user['group_id'] ? $site_user['group_id'] : $site_user['parent'];

            foreach ($esmo_groups as $gid => $group) {
                $selected = $site_user['parent'] == $gid ? 'selected': '';
                $html .= '<option value="'.$gid.'" '.$selected.'>'.$group['obj_name'].'</option>';
            }

            $html .= '</select></td>';

            // Роль ЭСМО
            $html .= '<td style="text-align: left">'
                .'<select style="width:200px;" class="ad-role-select form-control" data-uid="'.$site_user['pkey'].'" data-guid="'.$user->guid.'"><option value="0">-</option>';

            $user_roles = $_SESSION['ARR_roll'];
            foreach ($user_roles as $role_id => $role) {
                $selected = $site_user['rol'] == $role_id ? 'selected': '';
                $html .= '<option value="'.$role_id.'" '.$selected.'>'.$role['obj_name'].'</option>';
            }

            $html .= '</select></td>';
            $html .= '<td id="user_'.$site_user['pkey'].'"><button id="save_'.$user->guid.'" data-guid="'.$user->guid.'" class="v2" cmd="AD/save_user" uid="'.$site_user['pkey'].'" user_name="'.$user->username.'" dn="'.$user->dn.'" create="'.$create.'" >Сохранить</button></td>';
            $html .= '</tr>';
        }
        $html .= '</tbody></table>';

        $this->add_element('user_info.HTML', $html) ;
    }

	function save_AD_rol()
	   { $changes_AD=array() ;
	     $arr_ESMO=$_SESSION['ARR_roll'] ;
	     $cur_AD_groups=execSQL('select id,obj_name,pkey,personal_id from view_IL_ad_groups') ;


	     if (_sizeof($_POST['recs_rol'])) foreach($_POST['recs_rol'] as $ESMO_rol_id=>$rec_rol)
	     { if (isset($rec_rol['groups_AD']))
	       { // сбрасываем роль ЭСМО у текущей роли AD ЭСМО, роль ЭСМО храниться в поле personal_id
	         $old_AD_group_id=execSQL_value('select id from view_IL_ad_groups where personal_id='.$ESMO_rol_id) ;
	         $new_AD_group_id=$rec_rol['groups_AD'] ;
	         if ($new_AD_group_id!=$old_AD_group_id)
	         {  if ($old_AD_group_id)
	            {   $res=execSQL_update('update view_IL_ad_groups set personal_id=0 where id='.$old_AD_group_id) ;
	                $changes_AD[]='Группа AD "<strong>'.$cur_AD_groups[$old_AD_group_id]['obj_name'].'"</strong> - сброшена роль <strong>'.$arr_ESMO[$ESMO_rol_id]['obj_name'].'</strong> - <span class="green">OK</span>' ;
	            }

	            if ($new_AD_group_id>0)
	            { $old_ESMO_rol_id=execSQL_value('select personal_id from view_IL_ad_groups where id='.$new_AD_group_id) ;
	              execSQL_update('update view_IL_ad_groups set personal_id='.$ESMO_rol_id.' where id='.$new_AD_group_id) ;
	              $changes_AD[]='Группа AD "<strong>'.$cur_AD_groups[$new_AD_group_id]['obj_name'].'</strong>", роль ЭСМО: <strong>'.$arr_ESMO[$old_ESMO_rol_id]['obj_name'].'</strong> => <strong>'.$arr_ESMO[$ESMO_rol_id]['obj_name'].'</strong> - <span class="green">OK</span>' ;
	            }

	         }
	       }

	     }

	     if (_sizeof($changes_AD))
	     {   ob_start() ;
	     	 echo implode('<br>',$changes_AD) ;
	     	 $text=ob_get_clean() ;
	     	 echo $text ;
		     ?><br><br><div class="center"><button class="cancel">Закрыть</button></div><?
	     	 LOGS()->reg_log('AD_change_group',$text) ;
	         $this->add_element('show_modal_window','HTML',array('title'=>'Настройки групп AD','after_close_update_page'=>1,'width'=>'500px')) ;
	     }
	     else $this->add_element('show_notife','Изменений не обнаружено',array('color'=>'yellow')) ;
	   }

    // запоминаем выбранную группу в сессии в массиве $_SESSION['autorize_process'] и перезагружаем страницу для повторной авторизации
        function fixed_selected_rol()
        { $_SESSION['autorize_process']['rol_id']=$_POST['rol_id_to_auth'] ;
          $this->add_element('go_url','/cab/') ;
        }


    // отмена проверки сертификата
        function cancel_check_sertificate()
        {
            unset($_SESSION['autorize_process']) ;
            $_SESSION['member_AD_is_logout']=1 ;
            $this->add_element('go_url','/cab/') ;
        }

}
