import { isEmpty } from 'lodash';
import {
    brand,
    environment
} from './services/native/environment.nativeService';
import { brandEnvConfig, brandConfig } from './branding/types';
import type { Auth0SdkConfig } from './branding/types';
import { variable, dotEnvJson } from './dotEnvConfig';
import packageJson from '../package.json';
import { isAndroid, isIOS } from './constants/device';

export const BRAND = brand();
export const ENV = environment();

const dotEnvVariable = (variableName: string) => variable(ENV, variableName);
const booleanDotEnvVariable = (variableName: string) =>
    dotEnvVariable(variableName).toLowerCase() === 'true';

const envConfig = () => brandEnvConfig(BRAND, ENV);

const redirectionUrl = (): string => {
    const { scheme, host, port } = envConfig().redirection;
    return `${scheme}://${host}:${port}`;
};

//TODO: REmove this AUTH0 constants if they are not needed anymore
export const AUTH0_LOGIN_PAGE_URL = envConfig().auth0.loginPageUrl;
export const AUTH0_OAUTH_CLIENT_ID = envConfig().auth0.oauthClientId;
export const AUTH0_OAUTH_BASE_URL = envConfig().auth0.oauthBaseUrl;
export const GRAPHQL_BASE = dotEnvVariable('GRAPHQL_BASE');
export const SEGMENT_IOS_WRITE_KEY = dotEnvVariable('SEGMENT_IOS_WRITE_KEY');
export const SEGMENT_ANDROID_WRITE_KEY = dotEnvVariable(
    'SEGMENT_ANDROID_WRITE_KEY'
);
export const SENTRY_DSN = dotEnvVariable('SENTRY_DSN');
export const LOG_TO_SENTRY = booleanDotEnvVariable('LOG_TO_SENTRY');
export const CODE_PUSH_ENABLED = booleanDotEnvVariable('CODE_PUSH_ENABLED');
export const CODE_PUSH_ANDROID_DEPLOYMENT_KEY = dotEnvVariable(
    'CODE_PUSH_ANDROID_DEPLOYMENT_KEY'
);
export const CODE_PUSH_IOS_DEPLOYMENT_KEY = dotEnvVariable(
    'CODE_PUSH_IOS_DEPLOYMENT_KEY'
);
export const VERSION = packageJson?.version ?? '';
// eslint-disable-next-line
export let BUNDLE_VERSION_NAME =
    dotEnvJson?.BUNDLE_VERSION_NAME?.substring?.(0, 7) ?? '';
export const REDIRECTION_URL = redirectionUrl();

const APPLICATION_NAME: string = envConfig().applicationName;
export const applicationName = (): string => APPLICATION_NAME;

export const APP_STORE_ID = envConfig().ios.appStoreId;
export const PLAY_STORE_ID = envConfig().android.applicationId;

export const ENABLE_APOLLO_CACHE_PERSIST = true;

export const COMPANY_NAME: string = brandConfig(BRAND).company.name;
export const SUPPORT_EMAIL: string = brandConfig(BRAND).company.supportEmail;
export const USER_BRAND_FALLBACK: string =
    brandConfig(BRAND).company.userBrandFallback;

export const AUTH0_SDK_CONFIG: Auth0SdkConfig = envConfig().auth0Sdk;

export const DEBUGGING_SCOPES = dotEnvVariable('DEBUGGING_SCOPES');

export const DATADOG_ENABLED = booleanDotEnvVariable('DATADOG_ENABLED');
export const DATADOG_CLIENT_TOKEN = dotEnvVariable('DATADOG_CLIENT_TOKEN');
export const DATADOG_APPLICATION_ID = dotEnvVariable('DATADOG_APPLICATION_ID');

export const findSegmentWriteKey = (): string | undefined => {
    if (isIOS() && !isEmpty(SEGMENT_IOS_WRITE_KEY)) {
        return SEGMENT_IOS_WRITE_KEY;
    }
    if (isAndroid() && !isEmpty(SEGMENT_ANDROID_WRITE_KEY)) {
        return SEGMENT_ANDROID_WRITE_KEY;
    }
    return undefined;
};
