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;
using ProjectTracker.Library;
public partial class ResourceEdit : System.Web.UI.Page
{
  private enum Views
  {
    MainView = 0,
    AssignView = 1
  }
  protected void Page_Load(object sender, EventArgs e)
  {
    if (!IsPostBack)
    {
      Session["currentObject"] = null;
      ApplyAuthorizationRules();
    }
    else
      this.ErrorLabel.Text = "";
  }
  private void ApplyAuthorizationRules()
  {
    Resource obj = GetResource();
    // Resource display
    if (Resource.CanEditObject())
    {
      if (obj.IsNew)
        this.DetailsView1.DefaultMode = DetailsViewMode.Insert;
      else
        this.DetailsView1.DefaultMode = DetailsViewMode.Edit;
      this.AssignProjectButton.Visible = !obj.IsNew;
    }
    else
    {
      this.DetailsView1.DefaultMode = DetailsViewMode.ReadOnly;
      this.AssignProjectButton.Visible = false;
    }
    this.DetailsView1.Rows[this.DetailsView1.Rows.Count - 1].Visible = Resource.CanEditObject();
    // resources display
    this.GridView1.Columns[this.GridView1.Columns.Count - 1].Visible = Resource.CanEditObject();
  }
  #region DetailsView
  protected void DetailsView1_ItemInserted(object sender, DetailsViewInsertedEventArgs e)
  {
    Resource resource = GetResource();
    if (!resource.IsNew)
      Response.Redirect("ResourceEdit.aspx?id=" + resource.Id.ToString());
  }
  protected void DetailsView1_ItemUpdated(object sender, DetailsViewUpdatedEventArgs e)
  {
    ApplyAuthorizationRules();
  }
  protected void DetailsView1_ItemDeleted(object sender, DetailsViewDeletedEventArgs e)
  {
    Response.Redirect("ResourceList.aspx");
  }
  #endregion
  #region Project Grid
  protected void AssignProjectButton_Click(object sender, EventArgs e)
  {
    this.MultiView1.ActiveViewIndex = (int)Views.AssignView;
  }
  protected void GridView2_SelectedIndexChanged(object sender, EventArgs e)
  {
    Resource obj = GetResource();
    try
    {
      obj.Assignments.AssignTo(new Guid(this.GridView2.SelectedDataKey.Value.ToString()));
      if (SaveResource(obj) > 0)
      {
        this.GridView1.DataBind();
        this.MultiView1.ActiveViewIndex = (int)Views.MainView;
      }
    }
    catch (InvalidOperationException ex)
    {
      ErrorLabel.Text = ex.Message;
    }
  }
  protected void CancelAssignButton_Click(object sender, EventArgs e)
  {
    this.MultiView1.ActiveViewIndex = (int)Views.MainView;
  }
  #endregion
  #region RoleListDataSource
  protected void RoleListDataSource_SelectObject(object sender, Csla.Web.SelectObjectArgs e)
  {
    e.BusinessObject = RoleList.GetList();
  }
  #endregion
  #region ResourceDataSource
  protected void ResourceDataSource_DeleteObject(object sender, Csla.Web.DeleteObjectArgs e)
  {
    Resource.DeleteResource(int.Parse(e.Keys["Id"].ToString()));
    Session.Remove("currentObject");
    e.RowsAffected = 1;
  }
  protected void ResourceDataSource_InsertObject(object sender, Csla.Web.InsertObjectArgs e)
  {
    Resource obj = Resource.NewResource();
    Csla.Data.DataMapper.Map(e.Values, obj, "Id");
    e.RowsAffected = SaveResource(obj);
  }
  protected void ResourceDataSource_SelectObject(object sender, Csla.Web.SelectObjectArgs e)
  {
    e.BusinessObject = GetResource();
  }
  protected void ResourceDataSource_UpdateObject(object sender, Csla.Web.UpdateObjectArgs e)
  {
    Resource obj = GetResource();
    Csla.Data.DataMapper.Map(e.Values, obj);
    e.RowsAffected = SaveResource(obj);
  }
  #endregion
  #region AssignmentsDataSource
  protected void AssignmentsDataSource_DeleteObject(object sender, Csla.Web.DeleteObjectArgs e)
  {
    Resource obj = GetResource();
    Guid rid = new Guid(e.Keys["ProjectId"].ToString());
    obj.Assignments.Remove(rid);
    e.RowsAffected = SaveResource(obj);
  }
  protected void AssignmentsDataSource_SelectObject(object sender, Csla.Web.SelectObjectArgs e)
  {
    Resource obj = GetResource();
    e.BusinessObject = obj.Assignments;
  }
  protected void AssignmentsDataSource_UpdateObject(object sender, Csla.Web.UpdateObjectArgs e)
  {
    Resource obj = GetResource();
    ResourceAssignment res;
    Guid rid = new Guid(e.Keys["ProjectId"].ToString());
    res = obj.Assignments[rid];
    Csla.Data.DataMapper.Map(e.Values, res);
    e.RowsAffected = SaveResource(obj);
  }
  #endregion
  #region ProjectListDataSource
  
  protected void ProjectListDataSource_SelectObject(object sender, Csla.Web.SelectObjectArgs e)
  {
    e.BusinessObject = ProjectTracker.Library.ProjectList.GetProjectList();
  }
  #endregion
  private Resource GetResource()
  {
    object businessObject = Session["currentObject"];
    if (businessObject == null ||
      !(businessObject is Resource))
    {
      try
      {
        string idString = Request.QueryString["id"];
        if (!string.IsNullOrEmpty(idString))
        {
          int id = Int32.Parse(idString);
          businessObject = Resource.GetResource(id);
        }
        else
          businessObject = Resource.NewResource();
        Session["currentObject"] = businessObject;
      }
      catch (System.Security.SecurityException)
      {
        Response.Redirect("ResourceList.aspx");
      }
    }
    return (Resource)businessObject;
  }
  private int SaveResource(Resource resource)
  {
    int rowsAffected;
    try
    {
      Session["currentObject"] = resource.Save();
      rowsAffected = 1;
    }
    catch (Csla.Validation.ValidationException ex)
    {
      System.Text.StringBuilder message = new System.Text.StringBuilder();
      message.AppendFormat("{0}
", ex.Message);
      if (resource.BrokenRulesCollection.Count == 1)
        message.AppendFormat("* {0}: {1}",
          resource.BrokenRulesCollection[0].Property,
          resource.BrokenRulesCollection[0].Description);
      else
        foreach (Csla.Validation.BrokenRule rule in resource.BrokenRulesCollection)
          message.AppendFormat("* {0}: {1}
", rule.Property, rule.Description);
      this.ErrorLabel.Text = message.ToString();
      rowsAffected = 0;
    }
    catch (Csla.DataPortalException ex)
    {
      this.ErrorLabel.Text = ex.BusinessException.Message;
      rowsAffected = 0;
    }
    catch (Exception ex)
    {
      this.ErrorLabel.Text = ex.Message;
      rowsAffected = 0;
    }
    return rowsAffected;
  }
}