import { configDotenv } from 'dotenv';
import { join } from 'path';
configDotenv({
  path: join(process.cwd(), `.env`),
});
export default () => ({
  db: {
    database: process.env.DB_DATABASE,
    port: process.env.DB_PORT,
    host: process.env.DB_HOST,
    user: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
  },
  allowOrigins: process.env.ALLOW_ORIGINS,
  codef: {
    id: process.env.CODEF_ID,
    secret: process.env.CODEF_SECRET,
    authUrl: process.env.CODEF_OAUTH_URL,
    treatUrl: process.env.CODEF_TREAT_URL,
    treatCarUrl: process.env.CODEF_TREAT_CAR_URL,
    //* 심평원 '내가 먹는약 한눈에' API URL (task-01)
    drugUrl: process.env.CODEF_DRUG_URL,
    //* 심평원 다건요청(기본+자동차) 단일인증 다건수집 API path (task-06)
    treatMultiUrl: process.env.CODEF_TREAT_MULTI_URL,
    //* (예약) 국세청 연말정산간소화 의료비 API path — task-07용, 현재 미사용
    ntsMedicalUrl: process.env.CODEF_NTS_MEDICAL_URL,
  },
  //* 진료내역 스크래핑 공급자 스위치: 'codef'(기본) | 'coocon' | 'octover' | 'hyphen' | 'multi'(분산)
  treatProvider: process.env.TREAT_PROVIDER ?? 'codef',
  //* Redis (멀티 분산 카운터/큐). 예: redis://insuniverse-stg-redis...:6379
  redisUrl: process.env.REDIS_URL,
  //* 멀티('multi') 분산 풀: "key:분당한도:플로우비용:단가" 콤마구분. 비용 싼 곳 우선.
  treatPool: (process.env.TREAT_POOL ?? 'octover:30:3:1,coocon:30:3:1')
    .split(',')
    .map((s) => s.trim())
    .filter(Boolean)
    .map((s) => {
      const [key, limitPerMin, flowCost, unitCost] = s.split(':');
      return {
        key,
        limitPerMin: Number(limitPerMin) || 30,
        flowCost: Number(flowCost) || 3,
        unitCost: Number(unitCost) || 1,
      };
    }),
  //* 자동차보험 진료 수집 ON/OFF. 미설정/DB 장애 시 fail-closed(OFF), 명시적 true만 ON.
  enableTreatCar: process.env.ENABLE_TREAT_CAR === 'true',
  coocon: {
    authKey: process.env.COOCON_AUTH_KEY,
    //* 게이트웨이 URL (dev: https://dev2.coocon.co.kr:8443/domestic/finance/scrap/smart_gateway.jsp)
    gwUrl: process.env.COOCON_GW_URL,
    //* 간편인증 AES256-CBC 사용 여부 (기본 false=평문). true면 gwUrl을 _aes.jsp로 사용
    useAes: process.env.COOCON_USE_AES === 'true',
    //* AES256 키(32byte)/IV(16byte) — 쿠콘 이용고객별 발급 ([참조2])
    aesKey: process.env.COOCON_AES_KEY,
    aesIv: process.env.COOCON_AES_IV,
  },
  octover: {
    //* dev https://dev.octover.co.kr/otvapi / 운영 https://octover.co.kr/otvapi
    baseUrl: process.env.OCTOVER_BASE_URL,
    apiKey: process.env.OCTOVER_API_KEY,
    //* RSA-OAEP 공개키 PEM (미설정 시 번들 기본키 사용) — 보통 안 넣어도 됨
    rsaPublicKey: process.env.OCTOVER_RSA_PUBLIC_KEY,
    //* (분당 한도는 TREAT_POOL 에서 관리 — 여기 두지 않음)
  },
  hyphen: {
    //* 인포텍 API 게이트웨이 (미설정 시 https://apigw.infotech.co.kr/api/service)
    baseUrl: process.env.HYPHEN_BASE_URL,
    //* 발급키 — 요청 헤더 api-cloud-key (개발/운영 별도)
    apiKey: process.env.HYPHEN_API_KEY,
    //* 어플리케이션코드 — 요청 바디 appCd (예: 업체명-api)
    appCd: process.env.HYPHEN_APP_CD,
    //* 인포텍 실행 타임아웃(초, 요청 바디 exeTimeout) — 미설정 시 300(5분).
    //*   자료 과다 유저의 수집 세션 조기종료(B0002-999) 완화용. axios(330s)보다 작게 둘 것.
    exeTimeout: process.env.HYPHEN_EXE_TIMEOUT,
  },
  //* 자체 스크래퍼 엔진(scraper-engine) 베이스 URL. 미설정/풀 미등록 시 'inhouse' 공급자는 비활성.
  inhouse: {
    baseUrl: process.env.INHOUSE_BASE_URL,
    //* 엔진 호출 인증키 — 엔진 INHOUSE_API_KEY와 일치해야 함(PII 네트워크 경유 보호)
    apiKey: process.env.INHOUSE_API_KEY,
    //* 자체엔진 자동차 내부 카나리. 기본 OFF, 멀티 디스패처에서 inhouse로 선택된 요청에만 적용.
    carCanary: process.env.INHOUSE_CAR_CANARY === '1',
  },
  jwt: {
    secret: process.env.JWT_SECRET,
    accessTokenExpiry: process.env.JWT_ACCESS_TOKEN_EXPIRY,
    mokTokenExpiry: process.env.JWT_MOK_TOKEN_EXPIRY,
    adminAccessTokenExpiry: process.env.JWT_ADMIN_ACCESS_TOKEN_EXPIRY,
    refreshTokenExpiry: process.env.JWT_REFRESH_TOKEN_EXPIRY,
  },
  aes: {
    secret: process.env.AES_SECRET,
    iv: process.env.AES_IV,
  },
  s3: {
    bucket: process.env.S3_BUCKET,
  },
  cfn: {
    distributionId: process.env.CLOUDFRONT_DISTRIBUTION_ID,
  },
  toss: {
    clientKey: process.env.TOSS_CLIENT_KEY,
    secretKey: process.env.TOSS_SECRET_KEY,
    baseUrl: process.env.TOSS_BASE_URL,
    issueBillingEndPoint: process.env.TOSS_ISSUE_BILLING_ENDPOINT,
    payBillingEndPoint: process.env.TOSS_PAYMENT_BILLING_ENDPOINT,
    payCancelEndPoint: process.env.TOSS_PAYMENT_CANCEL_ENDPOINT,
  },
  aligo: {
    apiKey: process.env.ALIGO_API_KEY,
    senderKey: process.env.ALIGO_SENDER_KEY,
    userId: process.env.ALIGO_USER_ID,
    baseUrl: process.env.ALIGO_BASE_URL,
    alimtalkEndPoint: process.env.ALIGO_ALIMTALK_ENDPOINT,
    templateListEndPoint: process.env.ALIGO_TEMPLATE_LIST_ENDPOINT,
    historyListEndPoint: process.env.ALIGO_HISTORY_LIST_ENDPOINT,
    historyDetailEndPoint: process.env.ALIGO_HISTORY_DETAIL_ENDPOINT,
    smsHistoryDetailEndPoint: process.env.ALIGO_SMS_HISTORY_DETAIL_ENDPOINT,
    lossInviteTemplateCode:
      process.env.ALIGO_LOSS_INVITE_TEMPLATE_CODE ?? 'UK_1454',
    treatReminderTemplateCode: process.env.ALIGO_TREAT_REMINDER_TEMPLATE_CODE,
    lossReminderTemplateCode: process.env.ALIGO_LOSS_REMINDER_TEMPLATE_CODE,
    lossReminderDelayMs:
      Number(process.env.ALIGO_LOSS_REMINDER_DELAY_MS ?? 15_000) || 15_000,
    treatReminderDelayMs:
      Number(process.env.ALIGO_TREAT_REMINDER_DELAY_MS ?? 60_000) || 60_000,
  },
  user: {
    baseUrl: process.env.USER_BASE_URL,
  },
  mok: {
    origin: process.env.MOK_ORIGIN ?? '',
    resultAuthEndPoint: process.env.MOK_RESULT_AUTH_ENDPOINT ?? '',
    prefixId: process.env.MOK_PREFIX_ID ?? '',
    keyPath: process.env.MOK_KEY_PATH ?? '',
    password: process.env.MOK_PASSWORD ?? '',
    siteUrl: process.env.MOK_SITE_URL ?? '',
    returnUrl: process.env.MOK_RETURN_URL ?? '',
  },
  fcm: {
    privateKey: process.env.FCM_PRIVATE_KEY,
    clientEmail: process.env.FCM_CLIENT_EMAIL,
    projectId: process.env.FCM_PROJECT_ID,
  },
  chatbot: {
    googleChatWebhook: process.env.GOOGLE_CHAT_WEBHOOK_URL,
  },
  alert: {
    //* 웹훅 목적지 호스트 접미사 허용목록(CSV). 비면 chat.googleapis.com,hooks.slack.com 기본값.
    webhookHostAllow: process.env.ALERT_WEBHOOK_HOST_ALLOW ?? '',
    //* A6 API 축이 조회할 /health/detail 주소. **env 전용** — 관리자 화면에서 못 바꾼다(M2 §D7).
    //*  미설정이면 API 축을 건너뛰고 warn 으로 사실을 드러낸다. 값 선택은 계획 Q9.
    healthUrl: process.env.ALERT_HEALTH_URL ?? '',
  },
  google: {
    youtubeApiKey: process.env.YOUTUBE_API_KEY,
    youtubeApiBaseUrl: process.env.YOUTUBE_API_BASE_URL,
  },
  mailer: {
    host: process.env.MAILER_HOST,
    port: process.env.MAILER_PORT,
    user: process.env.MAILER_AUTH_USER,
    pass: process.env.MAILER_AUTH_PASS,
    default: process.env.MAILER_DEFAULT,
  },
  smartro: {
    mid: process.env.SMARTRO_MID,
    merchantKey: process.env.SMARTRO_MERCHANT_KEY,
    cancelPassword: process.env.SMARTRO_CANCEL_PASSWORD,
    baseUrl: process.env.SMARTRO_BASE_URL,
    approveEndpoint: process.env.SMARTRO_APPROVE_ENDPOINT,
    cancelEndpoint: process.env.SMARTRO_CANCEL_ENDPOINT,
  },
  //* 외부 서비스(보상닥터 등) 쿠콘 바이패스: 동시 슬롯 상한(client별). 쿠콘 인증키는 서버 보유.
  b2cBypass: {
    slot: Number(process.env.B2C_BYPASS_SLOT ?? 2),
  },
});
