import { merge } from "lodash";
import { ComponentPolicy } from "./component";

const jcrPrimary = { "@jcr:primaryType": "nt:unstructured" };

export type PagePolicyType = {
  "@cq:policy"?: string;
  childPolicies?: string;
}

export class PagePolicy {
  readonly "@jcr:primaryType": "nt:unstructured";
  readonly "@sling:resourceType": "wcm/core/components/policies/mappings";
  "@cq:policy"?: string;
  childPolicies?: object;
  
  constructor(options?: PagePolicyType, children?: object, policies?:ComponentPolicy[]) {
    this["@jcr:primaryType"] = "nt:unstructured";
    this["@sling:resourceType"] = "wcm/core/components/policies/mappings";
    if (options && options["@cq:policy"]) this["@cq:policy"] = options["@cq:policy"];

    if (children && typeof children === "object") {
      for (let child in children) {
        this[child] = children[child];
      }
    }

    if (options?.childPolicies) {
      let childPolicies = {};
      const childPolicy = {
        ...jcrPrimary, 
        "@sling:resourceType": this["@sling:resourceType"],
      }

      policies
        .filter((policy:ComponentPolicy) => policy.policy === options.childPolicies)
        .forEach((policy:ComponentPolicy) => {
          if (policy["@cq:policy"]) {
            let policyNodes = {};
            const resourceType = policy.component;
            resourceType.split("/").reverse().forEach((node, index) => {
              if (index === 0) policyNodes[node] = { ...childPolicy, "@cq:policy": policy["@cq:policy"] };
              else policyNodes = { [node]: { ...jcrPrimary, ...policyNodes } };
            });
            childPolicies = merge({}, childPolicies, policyNodes);
          }
        });
      
      for (let child in childPolicies) this[child] = childPolicies[child];
    }
  }
}