import { Injectable } from '@nestjs/common';
import * as dotenv from 'dotenv';
dotenv.config();

type App = {
  nodeEnv: string;
  name: string;
  workingDirectory: string;
  port: number;
  panelBaseUrl: string;
  apiBaseUrl: string;
};
type Auth = {
  secret: string;
  expires: string;
  expiresLifetime: string;
};
type Mail = {
  port: number;
  host: string;
  user: string;
  password: string;
  defaultEmail: string;
  defaultName: string;
  ignoreTLS: boolean;
  secure: boolean;
  requireTLS: boolean;
};
type Sms = {
  kavenegarKey: string;
};
type Gateway = {
  bankMeliMode: string; // live or sandbox
  bankMeliMerchantId: string;
  bankMeliTerminalId: string;
  bankMeliTerminalKey: string;

  zarinpalMode: string; // live or sandbox
  zarinpalMerchantId: string;

  snappPayMode: string; // live or sandbox
  snappPayClientId: string;
  snappPayClientSecret: string;
  snappPayUsername: string;
  snappPayPassword: string;
};
type ThirdParty = {
  alopeykMode: string; // live or sandbox
  alopeykToken: string;

  mahexMode: string; // live or sandbox
  mahexToken: string;

  samtHeaderUsername: string;
  samtHeaderPassword: string;
  samtBodyUsername: string;
  samtBodyPassword: string;
  samtSellerNationalCode: string;
  samtSellerCommercialCode: string;
  samtSellerPostalCode: string;

  veneshMode: string; // live or sandbox
  veneshUsername: string;
  veneshPassword: string;
  veneshClientId: number;
  veneshClientSecret: string;

  ghabzinoMode: string; // live or sandbox
  ghabzinoToken: string;

  sshafToken: string;
};

@Injectable()
export class ConfigurationService {
  public app: App;
  public auth: Auth;
  public mail: Mail;
  public sms: Sms;
  public gateway: Gateway;
  public thirdParty: ThirdParty;

  constructor() {
    this.getEnv();
  }

  async getEnv() {
    const env = process.env;

    this.app = {
      nodeEnv: env.NODE_ENV,
      name: env.APP_NAME,
      workingDirectory: env.PWD || process.cwd(),
      port: parseInt(env.APP_PORT || env.PORT, 10) || 3000,
      panelBaseUrl: env.PANEL_BASE_URL,
      apiBaseUrl: env.API_BASE_URL,
    };

    this.auth = {
      secret: env.AUTH_JWT_SECRET,
      expires: env.AUTH_JWT_TOKEN_EXPIRES_IN,
      expiresLifetime: env.AUTH_JWT_TOKEN_LIFETIME_EXPIRES_IN,
    };

    this.mail = {
      port: parseInt(env.MAIL_PORT, 10),
      host: env.MAIL_HOST,
      user: env.MAIL_USER,
      password: env.MAIL_PASSWORD,
      defaultEmail: env.MAIL_DEFAULT_EMAIL,
      defaultName: env.MAIL_DEFAULT_NAME,
      ignoreTLS: env.MAIL_IGNORE_TLS === 'true',
      secure: env.MAIL_SECURE === 'true',
      requireTLS: env.MAIL_REQUIRE_TLS === 'true',
    };

    this.sms = {
      kavenegarKey: env.KAVENEGAR_SECRET_KEY,
    };

    this.gateway = {
      bankMeliMode: env.BANK_MELI_MODE,
      bankMeliMerchantId: env.BANK_MELI_MERCHANT_ID,
      bankMeliTerminalId: env.BANK_MELI_TERMINAL_ID,
      bankMeliTerminalKey: env.BANK_MELI_TERMINAL_KEY,

      zarinpalMode: env.ZARINPAL_MODE,
      zarinpalMerchantId: env.ZARINPAL_MERCHANT_ID,

      snappPayMode: env.SNAPP_PAY_MODE,
      snappPayClientId: env.SNAPP_PAY_CLIENT_ID,
      snappPayClientSecret: env.SNAPP_PAY_CLIENT_SECRET,
      snappPayUsername: env.SNAPP_PAY_USERNAME,
      snappPayPassword: env.SNAPP_PAY_PASSWORD,
    };

    this.thirdParty = {
      alopeykToken: env.ALOPEYK_TOKEN,
      alopeykMode: env.ALOPEYK_MODE,

      mahexToken: env.MAHEX_TOKEN,
      mahexMode: env.MAHEX_MODE,

      samtHeaderUsername: env.SAMT_HEADER_USERNAME,
      samtHeaderPassword: env.SAMT_HEADER_PASSWORD,
      samtBodyUsername: env.SAMT_BODY_USERNAME,
      samtBodyPassword: env.SAMT_BODY_PASSWORD,
      samtSellerNationalCode: env.SAMT_SELLER_NATIONAL_CODE,
      samtSellerCommercialCode: env.SAMT_SELLER_COMMERCIAL_CODE,
      samtSellerPostalCode: env.SAMT_SELLER_POSTAL_CODE,

      veneshMode: env.VENESH_MODE,
      veneshUsername: env.VENESH_USERNAME,
      veneshPassword: env.VENESH_PASSWORD,
      veneshClientId: parseInt(env.VENESH_CLIENT_ID, 10),
      veneshClientSecret: env.VENESH_CLIENT_SECRET,

      ghabzinoMode: env.GHABZINO_MODE,
      ghabzinoToken: env.GHABZINO_TOKEN,

      sshafToken: env.SSHAF_TOKEN,
    };
  }
}
