export type ACLPolicy = "deny" | "allow";

export type ACLRule = {
  domain: string;
  policy: ACLPolicy;
  resources?: string[];
};

export type ACLDefaultRules = ACLRule[];
export type ACLGroupsRules = { [group: string]: ACLRule[]; };
export type ACLUsersRules = { [user: string]: ACLRule[]; };

export interface ACLConfiguration {
  default_policy?: ACLPolicy;
  any?: ACLDefaultRules;
  groups?: ACLGroupsRules;
  users?: ACLUsersRules;
}

export function complete(configuration: ACLConfiguration): ACLConfiguration {
  const newConfiguration: ACLConfiguration = (configuration)
    ? JSON.parse(JSON.stringify(configuration)) : {};

  if (!newConfiguration.default_policy) {
    newConfiguration.default_policy = "allow";
  }

  if (!newConfiguration.any) {
    newConfiguration.any = [];
  }

  if (!newConfiguration.groups) {
    newConfiguration.groups = {};
  }

  if (!newConfiguration.users) {
    newConfiguration.users = {};
  }

  return newConfiguration;
}