export interface UserLdapConfiguration {
    url: string;
    base_dn: string;
    
    additional_users_dn?: string;
    users_filter?: string;

    additional_groups_dn?: string;
    groups_filter?: string;
    
    group_name_attribute?: string;
    mail_attribute?: string;
    
    user: string; // admin username
    password: string; // admin password
}

export interface LdapConfiguration {
    url: string;
    
    users_dn: string;
    users_filter: string;

    groups_dn: string;
    groups_filter: string;
    
    group_name_attribute: string;
    mail_attribute: string;
    
    user: string; // admin username
    password: string; // admin password
}

type UserName = string;
type GroupName = string;
type DomainPattern = string;

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

export interface ACLConfiguration {
    default: ACLDefaultRules;
    groups: ACLGroupsRules;
    users: ACLUsersRules;
}

export interface SessionRedisOptions {
    host: string;
    port: number;
}

interface SessionCookieConfiguration {
    secret: string;
    expiration?: number;
    domain?: string;
    redis?: SessionRedisOptions;
}

export interface GmailNotifierConfiguration {
    username: string;
    password: string;
}

export interface FileSystemNotifierConfiguration {
    filename: string;
}

export interface NotifierConfiguration {
    gmail?: GmailNotifierConfiguration;
    filesystem?: FileSystemNotifierConfiguration;
}

export interface MongoStorageConfiguration {
    url: string;
}

export interface LocalStorageConfiguration {
    path?: string;
    in_memory?: boolean;
}

export interface StorageConfiguration {
    local?: LocalStorageConfiguration;
    mongo?: MongoStorageConfiguration;
}

export interface UserConfiguration {
    port?: number;
    logs_level?: string;
    ldap: UserLdapConfiguration;
    session: SessionCookieConfiguration;
    storage: StorageConfiguration;
    notifier: NotifierConfiguration;
    access_control?: ACLConfiguration;
}

export interface AppConfiguration {
    port: number;
    logs_level: string;
    ldap: LdapConfiguration;
    session: SessionCookieConfiguration;
    storage: StorageConfiguration;
    notifier: NotifierConfiguration;
    access_control?: ACLConfiguration;
}