using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Web.Script.Serialization;
using System.Web.Script.Services;
using System.Web.Services;
using TABS.MailCarrier.WebSDK.Contact;

/// <summary>
/// SelectOrgz의 요약 설명입니다.
/// </summary>
[WebService(Namespace = "http://tabslab.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// ASP.NET AJAX를 사용하여 스크립트에서 이 웹 서비스를 호출하려면 다음 줄의 주석 처리를 제거합니다. 
// [System.Web.Script.Services.ScriptService]
public class SelectOrgz : System.Web.Services.WebService
{
    public SelectOrgz()
    {
        //디자인된 구성 요소를 사용하는 경우 다음 줄의 주석 처리를 제거합니다. 
        //InitializeComponent(); 
    }

    public class TreeViewItem
    {
        public TreeViewItem(string id, string text)
        {
            this.id = id;
            this.text = text;
            this.hasChildren = false;
            this.spriteCssClass = "";
        }
        public string id { get; set; }
        public string text { get; set; }
        public bool hasChildren { get; set; }
        public string spriteCssClass { get; set; }
    }

    [WebMethod]
    // jsonp를 지원하기 위한 정의
    [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
    public void GetOrgzItems(string callback, string orgzId, string partId)
    {
        List<TreeViewItem> items = new List<TreeViewItem>();
        
        if (partId == "")
        {
            // 최상위 파트 정보를 읽어 트리를 구성한다.
            Organization orgz = new Organization(new Guid(orgzId));
            orgz.Load(false);
            foreach (OrganizationPart part in orgz.Parts)
            {
                TreeViewItem partItem = new TreeViewItem(part.ID.ToString(), part.Name);
                partItem.hasChildren = true;
                partItem.spriteCssClass = "fa-solid fa-user-plus";
                items.Add(partItem);
            }
        }
        else
        {
            // 현재 파트 노드 아래를 구성한다.
            OrganizationPart part = new OrganizationPart(new Guid(partId));
            part.Load();
            if (AppSetting.OrgzListPartFirst)
            {
                TraversePart(items, part);
                TraverseMember(items, part);
            }
            else
            {
                TraverseMember(items, part);
                TraversePart(items, part);
            }
        }
        
        // jsonp 응답 구성
        StringBuilder sb = new StringBuilder();
        JavaScriptSerializer js = new JavaScriptSerializer();
        sb.Append(callback + "(");
        sb.Append(js.Serialize(items));
        sb.Append(");");
        // jsonp 응답 전송
        Context.Response.Clear();
        Context.Response.ContentType = "application/json";
        Context.Response.Write(sb.ToString());
        Context.Response.End();
    }

    private static void TraversePart(List<TreeViewItem> items, OrganizationPart part)
    {
        foreach (OrganizationPart subPart in part.Parts)
        {
            TreeViewItem partItem = new TreeViewItem(subPart.ID.ToString(), subPart.Name);
            partItem.hasChildren = true;
            partItem.spriteCssClass = "fa-solid fa-user-plus";
            items.Add(partItem);
        }
    }

    private static void TraverseMember(List<TreeViewItem> items, OrganizationPart part)
    {
        foreach (OrganizationMember member in part.Members)
        {
            TreeViewItem memberItem = new TreeViewItem(member.ID.ToString(), member.Name);
            memberItem.hasChildren = false;
            items.Add(memberItem);
        }
    }
}
