import * as Convict from "convict";

import { renderDoc } from "./index";

interface Config {
    env: string;
    database: {
        port: number;
        host: string;
        pw: string;
    };
}

const configSchema: Convict.Schema<Config> = {
    env: {
        default: "TEST",
        format: ["TEST", "PROD"],
    },
    database: {
        host: {
            env: "DB_HOST",
            arg: "host",
            default: "localhost",
            format: "url",
            doc: "The host of foo",
        },
        port: {
            env: "DB_PORT",
            default: 3333,
            format: PortGreaterThausend,
            doc: "the port of foo",
        },
        pw: {
            default: "changeMe",
            env: "DB_PW",
            arg: "pw",
            format: String,
            sensitive: true,
            doc: "the database password. Choose with care or pay the price!",
        },
    },
};

const otherSchema = {
    env: {
        doc: "The application environment.",
        format: ["production", "development", "test"],
        default: "development",
        env: "NODE_ENV",
    },
    ip: {
        doc: "The IP address to bind.",
        format: "ipaddress",
        default: "127.0.0.1",
        env: "IP_ADDRESS",
    },
    port: {
        doc: "The port to bind.",
        format: "port",
        default: 8080,
        env: "PORT",
        arg: "port",
    },
    db: {
        host: {
            doc: "Database host name/IP",
            format: "*",
            default: "server1.dev.test",
        },
        name: {
            doc: "Database name",
            format: String,
            default: "users",
        },
    },
    admins: {
        doc: "Users with write access, or null to grant full access without login.",
        format: Array,
        nullable: true,
        default: null,
    },
};

const ssp = {
    apiPrefix: {
      format: String,
      default: 'api',
      doc: 'prefix for all controllers',
      env: 'API_PREFIX',
    },
    apiPort: {
      format: 'port',
      env: 'API_PORT',
      arg: 'api-port',
      default: 3333,
    },
    maxUploadSize: {
      format: Number,
      default: 100024,
      doc: 'max size of uploaded files in kilobytes',
      env: 'MAX_UPLOAD_SIZE',
    },
    localDev: {
      format: Boolean,
      default: false,
      arg: 'local-dev',
      env: 'LOCAL_DEV',
    },
    logLevel: {
      default: 'warn',
      env: 'LOG_LEVEL',
      format: ['log' , 'error' , 'warn' , 'debug' , 'verbose']
    },
    environment: {
      default: 'TEST',
      doc: 'if set to TEST only instances with prefix NT can be targeted',
      format: ['TEST', 'INT', 'PROD', 'LOCAL'],
      env: 'ENVIRONMENT',
    },
    configFilePath: {
      format: String,
      env: 'CONFIG_FILE_PATH',
      arg: 'config',
      default: './config.yaml',
    },
    database: {
      host: {
        format: String,
        default: 'localhost',
        env: 'DB_HOST',
      },
      user: {
        default: 'postgres',
        format: String,
        env: 'DB_USER',
      },
      pw: {
        default: 'Password1!',
        format: String,
        env: 'DB_PW',
        sensitive: true,
      },
      name: {
        default: 'SelfService',
        format: String,
        env: 'DB_NAME',
      },
      ssl: {
        default: true,
        format: Boolean,
        env: 'DB_SSL',
      },
      port: {
        default: 5432,
        format: 'port',
        env: 'DB_PORT',
      },
      schema: {
        default: 'public',
        format: String,
        env: 'DB_SCHEMA',
      },
      synchronize: {
        default: false,
        format: Boolean,
        env: 'DB_SYNCHRONIZE',
      },
    },
    metadata: {
      loginUrl: {
        default: 'https://apphub-restart-test.app.corpintra.net/login/',
        env: 'APPHUB_LOGINURL',
        format: String,
      },
      logoutUrl: {
        default: 'https://apphub-restart-test.app.corpintra.net/logout',
        env: 'APPHUB_LOGOUTURL',
        format: String,
      },
      userManualUrl: {
        default: 'https://social.intra.corpintra.net/groups/datenqualit%C3%A4ts-offensive/projects/selfservice-portal/pages/home',
        env: 'USER_MANUAL_URL',
        format: String,
      },
      socialIntranetUrl: {
        default: 'https://social.intra.corpintra.net/groups/app-hub/pages/home',
        env: 'SOCIAL_INTRANET_URL',
        format: String,
      },
      webTicketUrl: {
        default: 'https://cism-web.es.corpintra.net/cgi-bin/webTickets/webTicket.pl?t=Autoline_AppHub_Stoerung',
        env: 'WEB_TICKET_URL',
        format: String,
      },
      authorizationTicketUrl: {
        default: 'https://cism-web.es.corpintra.net/cgi-bin/webTickets/webTicket.pl?t=Autoline_AppHub_Berechtigung',
        env: 'AUTHORIZATION_TICKET_URL',
        format: String,
      },
      supportMail: {
        default: 'https://cism-web.es.corpintra.net/cgi-bin/webTickets/webTicket.pl?t=Autoline_AppHub_Berechtigung',
        env: 'SUPPORT_MAIL',
        format: String,
      }
    },
    applicationIdentifier: {
      default: 'ssp',
      env: 'APPLICATION_IDENTIFIER',
      format: String,
    },
    roleManagementMatrix: {
      kdm: {
        format: Array,
        default: [
          'APPHUB.AppHub_SST_KDM',
          'APPHUB.AppHub_SST_KDM_Truck',
        ],
      },
      accounting: {
        format: Array,
        default: [
          'APPHUB.AppHub_SST_Accounting',
          'APPHUB.AppHub_SST_Accounting_Truck',
          'APPHUB.AppHub_SST_KDM',
          'APPHUB.AppHub_SST_KDM_Truck',
        ],
      },
      aftersales: {
        format: Array,
        default: [
          'APPHUB.AppHub_SST_Aftersales',
          'APPHUB.AppHub_SST_Aftersales_Truck',
          'APPHUB.AppHub_SST_KDM',
          'APPHUB.AppHub_SST_KDM_Truck',
        ],
      },
      parts: {
        format: Array,
        default: [
          'APPHUB.AppHub_SST_Parts',
          'APPHUB.AppHub_SST_Parts_Truck',
          'APPHUB.AppHub_SST_KDM',
          'APPHUB.AppHub_SST_KDM_Truck',
        ],
      },
      sales: {
        format: Array,
        default: [
          'APPHUB.AppHub_SST_Sales',
          'APPHUB.AppHub_SST_Sales_Truck',
          'APPHUB.AppHub_SST_KDM',
          'APPHUB.AppHub_SST_KDM_Truck',
        ],
      },
    },
    jwksUri: {
      default: 'http://tex-service.ingress/JWKS',
      format: 'url',
      env: 'I3_JWKS_URI',
      doc: 'The url to get all well-known keys for JWT'
    },
    fileCleanup: {
      nameGlobs: {
        format: 'Array',
        default: ['transfertoautoline/**/NT[0-9][0-9]?*.*'],
        doc: 'List of globs that specify which files older than the expiration period will be deleted'
      },
      olderThanDays: {
        default: 28,
        doc: 'After a duration of n days, the files selected by the globs are deleted',
        format: "int",
        env: 'FILE_CLEANUP_OLDER_THAN_DAYS'
      },
      dryRun: {
        format: Boolean,
        default: true,
        doc: 'Run through and reports activity without writing out results',
        env: 'FILE_CLEANUP_DRY_RUN',
      }
    }
  }


console.log(renderDoc(configSchema, ['name', 'doc']));

console.log(renderDoc(otherSchema));

console.log(renderDoc(ssp))

function PortGreaterThausend(port: string): never {
    throw new Error('not implented');
}
