export interface Config {
  application: ConfigApplication
  session: ConfigSession
  reverseProxy: {
    disableCompression?: boolean
    disableEtag?: boolean
    urlPrefix?: string
  }
  activeDirectory?: ConfigActiveDirectory
  users: {
    testing?: string[]
    canLogin?: string[]
    canUpdate?: string[]
    isAdmin?: string[]
  }
  aliases: {
    lot?: string
    lots?: string
    map?: string
    maps?: string
    occupancy?: string
    occupancies?: string
    occupancyStartDate?: string
    occupant?: string
    occupants?: string
    externalReceiptNumber?: string
    workOrderOpenDate?: string
    workOrderCloseDate?: string
  }
  settings: {
    fees: {
      taxPercentageDefault?: number
    }
    map: {
      mapCityDefault?: string
      mapProvinceDefault?: string
    }
    lot: {
      lotNamePattern?: RegExp
      lotNameHelpText?: string
      lotNameSortNameFunction?: (lotName: string) => string
    }
    lotOccupancy: {
      lotIdIsRequired?: boolean
      occupancyEndDateIsRequired?: boolean
      occupantCityDefault?: string
      occupantProvinceDefault?: string
      prints?: string[]
    }
    workOrders: {
      workOrderNumberLength?: number
      workOrderMilestoneDateRecentBeforeDays?: number
      workOrderMilestoneDateRecentAfterDays?: number
      calendarEmailAddress?: string
      prints?: string[]
    }
    adminCleanup: {
      recordDeleteAgeDays?: number
    }
    printPdf: {
      contentDisposition?: 'attachment' | 'inline'
    }
  }
}

interface ConfigApplication {
  applicationName?: string
  backgroundURL?: string
  logoURL?: string
  httpPort?: number
  userDomain?: string
  useTestDatabases?: boolean
  ntfyStartup?: ConfigNtfyStartup
}

export interface ConfigNtfyStartup {
  topic: string
  server?: string
}

interface ConfigSession {
  cookieName?: string
  secret?: string
  maxAgeMillis?: number
  doKeepAlive?: boolean
}

export interface ConfigActiveDirectory {
  url: string
  baseDN: string
  username: string
  password: string
}
