import ajax from '../utils/ajax.js'
import _buildBodyForSOAP from './_buildBodyForSOAP.js'
/**
  @name $SP().list.info
  @function
  @description Get the columns' information/metadata, and the list's details

  @return {Promise} resolve(infos), reject(error)

  @example
  $SP().list("List Name").info().then(function(infos) {
    // for columns' details:
    for (var i=0; i&lt;infos.length; i++) console.log(infos[i]["DisplayName"]+ ": => ",infos[i]);
    // for list's details:
    console.log(infos._List)
  });
*/
export default function info() {
  // check if we need to queue it
  if (!this.listID) throw "[SharepointPlus 'info'] the list ID/Name is required.";
  if (!this.url) throw "[SharepointPlus 'info'] not able to find the URL!"; // we cannot determine the url

  // do the request
  return ajax.call(this, {
    url: this.url + "/_vti_bin/lists.asmx",
    body: _buildBodyForSOAP("GetList", '<listName>'+this.listID+'</listName>'),
    headers:{'SOAPAction':'http://schemas.microsoft.com/sharepoint/soap/GetList'}
  })
  .then(function(data) {
    var aReturn = [], arr = data.getElementsByTagName('Field'), index = 0, aIndex, attributes, attrName, attrValue, lenDefault, nodeDefault,i,j,a,r,k,nName,nValue;
    // retrieve list info first
    var listDetails = data.getElementsByTagName('List');
    listDetails = (listDetails.length>0 ? listDetails[0] : null);
    attributes=listDetails.attributes;
    aReturn["_List"]={};
    for (i=0; i<attributes.length; i++) {
      aReturn["_List"][attributes[i].nodeName]=attributes[i].nodeValue
    }
    // then retrieve fields info
    for (i=0; i < arr.length; i++) {
      if (arr[i].getAttribute("ID")) {
        aReturn[index] = [];
        aIndex=aReturn[index];
        attributes=arr[i].attributes;
        for (j=attributes.length; j--;) {
          attrName=attributes[j].nodeName;
          attrValue=attributes[j].nodeValue;
          if (attrName==="Type") {
            switch (attrValue) {
              case "Choice":
              case "MultiChoice": {
                aIndex["FillInChoice"] = arr[i].getAttribute("FillInChoice");
                a=arr[i].getElementsByTagName("CHOICE");
                r=[];
                for(k=0; k<a.length; k++) r.push(a[k].firstChild.nodeValue);
                aIndex["Choices"]=r;
                break;
              }
              case "Lookup":
              case "LookupMulti":
                aIndex["Choices"]={list:arr[i].getAttribute("List"),field:arr[i].getAttribute("ShowField")};
                break;
              case "TaxonomyFieldType":
              case "TaxonomyFieldTypeMulti": {
                a=arr[i].getElementsByTagName("Property");
                aIndex["Property"]={};
                for(k=0; k<a.length; k++) {
                  nName=a[k].getElementsByTagName('Name');
                  nValue=a[k].getElementsByTagName('Value');
                  if (nName.length>0) aIndex["Property"][nName[0].firstChild.nodeValue]=(nValue.length>0?nValue[0].firstChild.nodeValue:null);
                }
                break;
              }
              default:
                aIndex["Choices"] = [];
            }
          }
          aIndex[attrName]= attrValue;
        }

        // find the default values
        lenDefault=arr[i].getElementsByTagName("Default").length;
        if (lenDefault>0) {
          nodeDefault=arr[i].getElementsByTagName("Default");
          aReturn[index]["DefaultValue"]=[];
          for (var q=0; q<lenDefault; q++) nodeDefault[q].firstChild && aReturn[index]["DefaultValue"].push(nodeDefault[q].firstChild.nodeValue);
          if (lenDefault===1) aReturn[index]["DefaultValue"]=aReturn[index]["DefaultValue"][0];
        } else aReturn[index]["DefaultValue"]=null;

        index++;
      }
    }

    return aReturn;
  })
}
