using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class RoleManager : System.Web.UI.Page
{
   protected void Page_Load(object sender, EventArgs e)
   {
      labName.Text = User.Identity.Name;
      if (! IsPostBack)
      {
         btnSaveRoles.Visible = false;
      }
   }

   /// <summary>
   /// Z listy wybrano użytkownika, a zatem sprawdź odpowiednie role na liście
   /// </summary>
   protected void drpUsers_SelectedIndexChanged(object sender, EventArgs e)
   {
      btnSaveRoles.Visible = true;

      // sprawdź, którego użytkownika wybrano
      string username = drpUsers.SelectedValue;

      // pobierz role dla wybranego użytkownika
      string[] userRoles = Roles.GetRolesForUser(username);

      // przejdź przez wszystkie pozycje na liście pól wyboru ról
      foreach (ListItem item in chkRoles.Items)
      {
         string rolename = item.Value;
         // if this role is a user role, then select it
         if (Roles.IsUserInRole(username, rolename))
            item.Selected = true;
         else
            item.Selected = false;
      }
   }

   /// <summary>
   /// Zapisz role użytkownika
   /// </summary>
   protected void btnSaveRoles_Click(object sender, EventArgs e)
   {
      // sprawdź, którego użytkownika wybrano
      string username = drpUsers.SelectedValue;

      // przejdź przez wszystkie pola wyboru
      foreach (ListItem item in chkRoles.Items)
      {
         string rolename = item.Value;
         if (item.Selected)
         {
            // użytkownika należy dodać do roli tylko wtedy, gdy nie ma go jeszcze w zbiorze danych
            if (! Roles.IsUserInRole(username, rolename))
               Roles.AddUserToRole(username, rolename);
         }
         else
         {
            // użytkownika należy usunąć z roli tylko wtedy, gdy znajduje się w zbiorze danych
            if (Roles.IsUserInRole(username, rolename))
               Roles.RemoveUserFromRole(username, rolename);
         }
      }
   }

   /// <summary>
   /// Dodaj nową rolę
   /// </summary>
   protected void btnAddRole_Click(object sender, EventArgs e)
   {
      string rolename = txtRole.Text;
      if (rolename.Length == 0) return;

      // dodaj rolę tylko wtedy, gdy jeszcze nie istnieje
      if (!Roles.RoleExists(rolename))
      {
         Roles.CreateRole(rolename);
         chkRoles.DataBind();
      }
   }

   /// <summary>
   /// Usuń istniejącą rolę
   /// </summary>
   protected void btnDeleteRole_Click(object sender, EventArgs e)
   {
      string rolename = txtDeleteRole.Text;
      if (rolename.Length == 0) return;
      // usuń rolę tylko wtedy, gdy istnieje
      if (Roles.RoleExists(rolename))
      {
         // usuń wszystkich użytkowników z tej roli
         MembershipUserCollection users = Membership.GetAllUsers();
         foreach (MembershipUser user in users)
         {
            string username = user.UserName;
            // użytkownika należy usunąć z roli tylko wtedy, gdy znajduje się w zbiorze danych
            if (Roles.IsUserInRole(username, rolename))
               Roles.RemoveUserFromRole(username, rolename);
         }
         
         // teraz usuń rolę
         Roles.DeleteRole(rolename);
         chkRoles.DataBind();
      }
   }
}
