import { countryCode, URLS } from "../api/apiConfig";
import { TLogEvent } from "../api/TLogEvent";
import { LOG_MENU, LOG_TP_NO } from "../utils/Config";
import {
  formatGMTString,
  getTimeDifferenceByMilliseconds,
} from "../utils/helperMethods";
import { setGNBMenu, setSecondLayerInfo } from "./commonActions";

export const getUrlByLogTpNo = (logTpNo) => {
  switch (logTpNo) {
    // IG-LGSP-LOG-001 / Live 시청 이력
    case LOG_TP_NO.LIVE.HOME:
    case LOG_TP_NO.LIVE.FEATURED_BRANDS:
    case LOG_TP_NO.LIVE.FULL:
    case LOG_TP_NO.LIVE.ITEM_DETAIL:
      return URLS.LOG_LIVE;

    // IG-LGSP-LOG-002 / VOD 시청 이력
    case LOG_TP_NO.VOD.FULL_VOD:
    case LOG_TP_NO.VOD.POPULAR_SHOWS_AND_HOT_PICKS:
    case LOG_TP_NO.VOD.FEATURED_BRANDS_VOD: // no cases
    case LOG_TP_NO.VOD.HOME_VOD:
    case LOG_TP_NO.VOD.ITEM_DETAIL_VOD:
    case LOG_TP_NO.VOD.FULL_MEDIA:
    case LOG_TP_NO.VOD.ITEM_DETAIL_MEDIA:
      return URLS.LOG_VOD;

    // IF-LGSP-LOG-003 / Curation View 이력
    case LOG_TP_NO.CURATION.HOT_PICKS:
    case LOG_TP_NO.CURATION.SHOWROOM:
    case LOG_TP_NO.CURATION.ON_SALE:
    case LOG_TP_NO.CURATION.HOME:
    case LOG_TP_NO.CURATION.CATEGORY:
      return URLS.LOG_CURATION;

    // IF-LGSP-LOG-004 / Entry 이력
    case LOG_TP_NO.SECOND_LAYER:
      return URLS.LOG_SECOND_LAYER;

    // IF-LGSP-LOG-005 / GNB 클릭 이력
    case LOG_TP_NO.GNB:
      return URLS.LOG_GNB;

    // IF-LGSP-LOG-006 / 상품 상세 이력
    case LOG_TP_NO.PRODUCT.PRODUCT_DETAIL:
    case LOG_TP_NO.PRODUCT.GROUP_DETAIL:
    case LOG_TP_NO.PRODUCT.BILLING_PRODUCT_DETAIL:
    case LOG_TP_NO.PRODUCT.PRODUCT_DETAIL_IMAGE:
      return URLS.LOG_PRODUCT;

    // IF-LGSP-LOG-007 / Detail 상세 이력
    case LOG_TP_NO.DETAIL.THEME_DETAIL:
    case LOG_TP_NO.DETAIL.TRAVEL_DETAIL:
    case LOG_TP_NO.DETAIL.DETAIL_BUTTON_CLICK:
      return URLS.LOG_DETAIL;

    // IF-LGSP-LOG-008 / Shop by mobile 이력
    case LOG_TP_NO.SHOP_BY_MOBILE.SHOP_BY_MOBILE:
    case LOG_TP_NO.SHOP_BY_MOBILE.AGREE_AND_SEND:
    case LOG_TP_NO.SHOP_BY_MOBILE.QR_CODE_REDIRECT_AND_CREATE_TRACKING_LOG:
      return URLS.LOG_SHOP_BY_MOBILE;

    // IF-LGSP-LOG-009 / Partners 클릭 이력
    case LOG_TP_NO.PARTNERS:
      return URLS.LOG_PARTNERS;

    // IF-LGSP-LOG-010 / Reminder - Alert On/Off
    case LOG_TP_NO.MY_PAGE_ALERT_FLAG:
      return URLS.LOG_MY_PAGE_ALERT_FLAG;

    // IF-LGSP-LOG-011 / My Page Delete 버튼 클릭 이력
    case LOG_TP_NO.MY_PAGE_MY_DELETE:
      return URLS.LOG_MY_PAGE_MY_DELETE;

    // IF-LGSP-LOG-012 / My Page Notice View
    case LOG_TP_NO.MY_PAGE_NOTICE:
      return URLS.LOG_MY_PAGE_NOTICE;

    // IF-LGSP-LOG-013 / 검색 이력
    case LOG_TP_NO.SEARCH:
      return URLS.LOG_SEARCH;

    // IF-LGSP-LOG-014 / 검색 결과 클릭 이력
    case LOG_TP_NO.SEARCH_CLICK:
      return URLS.LOG_SEARCH_CLICK;

    // IF-LGSP-LOG-015 / Upcoming On/Off
    case LOG_TP_NO.UPCOMING_FLAG:
      return URLS.LOG_UPCOMING_FLAG;

    // IF-LGSP-LOG-017 / 알람 팝업
    case LOG_TP_NO.ALARM_POP:
      return URLS.LOG_ALARM_POP;

    // IF-LGSP-LOG-018 / 알람 팝업 OK/NO 클릭
    case LOG_TP_NO.ALARM_CLICK.BROADCAST:
    case LOG_TP_NO.ALARM_CLICK.KEYWORD:
      return URLS.LOG_ALARM_CLICK;

    // IF-LGSP-LOG-020 / 테마 상품 상세 이력 → 테마 상품 클릭 이력
    case LOG_TP_NO.THEME_PRODUCT:
      return URLS.LOG_THEME_PRODUCT;

    // IF-LGSP-LOG-100 / IF-LGSP-LOG-100 / TOP contents 노출 이력
    case LOG_TP_NO.TOP_CONTENTS.VIEW:
    case LOG_TP_NO.TOP_CONTENTS.CLICK:
      return URLS.LOG_TOP_CONTENTS;

    // IF-LGSP-LOG-110 / Featured Brands View 이력
    case LOG_TP_NO.BRANDS:
      return URLS.LOG_BRANDS;

    // IF-LGSP-LOG-101 / 약관 동의, 미동의 클릭 이력
    case LOG_TP_NO.TERMS.AGREE:
    case LOG_TP_NO.TERMS.DO_NOT_AGREE:
    case LOG_TP_NO.TERMS.TEARMS_CONDITIONS:
    case LOG_TP_NO.TERMS.PRIVACY_POLICY:
      return URLS.LOG_TERMS;

    // IF-LGSP-LOG-102 / LG Account 로그인 이력
    case LOG_TP_NO.LG_ACCOUNT_LOGIN:
      return URLS.LOG_ACCOUNT_LOGIN;

    // IF-LGSP-LOG-103 / Order 화면 버튼 클릭 이력
    case LOG_TP_NO.ORDER_BTN_CLICK:
      return URLS.LOG_ORDER_BTN_CLICK;

    // IF-LGSP-LOG-104 / Order 취소/반품/교환 이력
    case LOG_TP_NO.ORDER_CHANGE:
      return URLS.LOG_ORDER_CHANGE;

    // IF-LGSP-LOG-105 / 쿠폰 사용 이력
    case LOG_TP_NO.COUPON_USE:
      return URLS.LOG_COUPON_USE;

    // IF-LGSP-LOG-108 / 결제 페이지 진입 이력
    case LOG_TP_NO.PAYMENT_ENTRY:
      return URLS.LOG_PAYMENT_ENTRY;

    // IF-LGSP-LOG-109 / 결제 완료 이력
    case LOG_TP_NO.PAYMENT_COMPLETE:
      return URLS.LOG_PAYMENT_COMPLETE;

    // IF-LGSP-LOG-111 / 카드, 주소 ADD/EDIT 이력
    case LOG_TP_NO.MY_INFO_EDIT:
      return URLS.LOG_MY_INFO_EDIT;

    // IF-LGSP-LOG-112 / Check out 화면 버튼 클릭 이력
    case LOG_TP_NO.CHECKOUT_BTN_CLICK:
      return URLS.LOG_CHECKOUT_BTN_CLICK;

    default:
      return;
  }
};

export const postTotalLog = (params, url) => (dispatch, getState) => {
  const onSuccess = (response) => {
    // console.log("#Total Log onSuccess.....", response);
  };

  const onFail = (error) => {
    // console.error("totalLog onFail...", error);
  };

  TLogEvent(
    dispatch,
    getState,
    "post",
    URLS.LOG_TOTAL_RECOMMEND,
    {},
    params,
    onSuccess,
    onFail,
    true
  );
};

export const postLog = (params, url) => (dispatch, getState) => {
  const { logTpNo } = params;

  const onSuccess = (response) => {
    // console.log(
    //   `postLog onSuccess logTpNo ${logTpNo}`,
    //   JSON.parse(response.config.data)
    // );
  };

  const onFail = (error) => {
    console.error("postLog onFail", error);
  };

  TLogEvent(
    dispatch,
    getState,
    "post",
    url ?? getUrlByLogTpNo(logTpNo),
    {},
    params,
    onSuccess,
    onFail
  );
};

/**
 * deepLink 수신 상태 모니터
 *
 * (?) deeplinkId 딥 링크 아이디
 *
 * (?) flag 딥 링크 여부
 */
export const sendLogDeepLinkFlag = (params) => (dispatch, getState) => {
  const { deeplinkId, flag } = params;
  dispatch(postLog({ deeplinkId, flag }, URLS.LOG_DEEPLINK));
};

/**
 * IG-LGSP-LOG-001 / Live 시청 이력
 *
 * (M) entryMenu 진입 메뉴
 *
 * (O) lgCatCd 카테고리 코드
 *
 * (O) lgCatNm 카테고리 네임
 *
 * (O) linkTpCd 딥링크 타입
 *
 * (M) logTpNo 로그 타입 넘버
 *
 * (M) nowMenu 현재 메뉴
 *
 * (M) patncNm 파트너 네임
 *
 * (M) patnrId 파트너 아이디
 *
 * (M) showId 쇼 아이디
 *
 * (M) showNm 쇼 네임
 *
 * (O) vdoTpNm 영상 가로 세로 여부 ("Vertical" or "Horizontal")
 *
 * (M) watchEndDt 시청 종료 시간
 *
 * (M) watchStrtDt 시청 시작 시간
 */
export const sendLogLive = (params, callback) => (dispatch, getState) => {
  const { logTpNo, patncNm, patnrId, showId, watchStrtDt } = params;
  const { entryMenu, nowMenu } = getState().common.menu;

  if (!logTpNo || !patncNm || !patnrId || !showId || !watchStrtDt) {
    console.log("[sendLogLive] invalid params", params);
    return;
  }

  const newParams = {
    ...params,
    entryMenu: params?.entryMenu ?? entryMenu,
    nowMenu: params?.nowMenu ?? nowMenu,
    watchEndDt: params?.watchEndDt ?? formatGMTString(new Date()),
  };

  if (getTimeDifferenceByMilliseconds(watchStrtDt, newParams.watchEndDt)) {
    dispatch(postLog(newParams));

    if (callback) {
      callback();
    }
  }
};

/**
 * IG-LGSP-LOG-002 / VOD 시청 이력
 *
 * (M) entryMenu 진입 메뉴
 *
 * (O) lgCatCd 카테고리 코드
 *
 * (O) lgCatNm 카테고리 이름
 *
 * (O) linkTpCd 딥링크 타입
 *
 * (M) logTpNo 로그 타입 넘버
 *
 * (M) nowMenu 현재 메뉴
 *
 * (M) patncNm 파트너 이름
 *
 * (M) patnrId 파트너 아이디
 *
 * (M) showId 방송 아이디 (media case: prdtId)
 *
 * (M) showNm 방송 이름 (media case: prdtNm)
 *
 * (O) vdoTpNm 영상 가로 세로 여부 ("Vertical" or "Horizontal")
 *
 * (M) watchEndDt 시청 종료 시간
 *
 * (M) watchStrtDt 시청 시작 시간
 */
export const sendLogVOD = (params, callback) => (dispatch, getState) => {
  const { logTpNo, showId, watchStrtDt } = params;
  const { entryMenu, nowMenu } = getState().common.menu;

  if (!logTpNo || !watchStrtDt) {
    console.log("[sendLogLive] invalid params", params);
    return;
  }

  if (
    (logTpNo === LOG_TP_NO.VOD.FULL_VOD ||
      logTpNo === LOG_TP_NO.VOD.POPULAR_SHOWS_AND_HOT_PICKS ||
      logTpNo === LOG_TP_NO.VOD.FEATURED_BRANDS_VOD ||
      logTpNo === LOG_TP_NO.VOD.HOME_VOD ||
      logTpNo === LOG_TP_NO.VOD.ITEM_DETAIL_VOD) &&
    !showId
  ) {
    return;
  }

  const newParams = {
    ...params,
    entryMenu: params?.entryMenu ?? entryMenu,
    nowMenu: params?.nowMenu ?? nowMenu,
    watchEndDt: params?.watchEndDt ?? formatGMTString(new Date()),
  };

  if (getTimeDifferenceByMilliseconds(watchStrtDt, newParams.watchEndDt)) {
    dispatch(postLog(newParams));

    if (callback) {
      callback();
    }
  }
};

/**
 * IF-LGSP-LOG-003 / Curations View 이력
 *
 * (O) cnttTpNm 컨텐츠 타입 네임 "show" / "item"
 *
 * (O) curationId 큐레이션 아이디
 *
 * (O) curationNm 큐레이션 네임
 *
 * (M) entryMenu 진입 메뉴
 *
 * (M) expsOrd 노출 순서
 *
 * (O) lgCatCd 카테고리 코드
 *
 * (O) lgCatNm 카테고리 네임
 *
 * (O) linkTpCd 딥링크 타입
 *
 * (M) logTpNo 로그 타입 넘버
 *
 * (M) nowMenu 현재 메뉴
 *
 * (O) patncNm 파트너 네임
 *
 * (O) patnrId 파트너 아이디
 *
 * (O) sortTpNm 정렬 타입 네임 "popular" / "new"
 */
export const sendLogCuration = (params) => (dispatch, getState) => {
  const { logTpNo } = params;
  const { entryMenu, nowMenu } = getState().common.menu;

  if (!logTpNo) {
    console.log("[sendLogCuration] invalid params", params);
    return;
  }

  const newParams = {
    cnttTpNm: params.cnttTpNm ?? "",
    curationId: params.curationId ?? "",
    curationNm: params.curationNm ?? "",
    entryMenu: entryMenu,
    expsOrd: params.expsOrd ?? "",
    lgCatCd: params.lgCatCd ?? "",
    lgCatNm: params.lgCatNm ?? "",
    logTpNo: params.logTpNo ?? "",
    linkTpCd: params.linkTpCd ?? "",
    nowMenu: nowMenu,
    patncNm: params.patncNm ?? "",
    patnrId: params.patnrId ?? "",
    sortTpNm: params.sortTpNm ?? "",
  };

  dispatch(postLog(newParams));
};

/**
 * IF-LGSP-LOG-004 / Entry 이력
 *
 * (M) clientIP 클라이언트 아이피 (server)
 *
 * (M) entryMenu 진입 메뉴
 *
 * (O) linkTpCd 딥링크 타입
 *
 * (M) logTpNo 로그 타입 넘버
 *
 * (M) nowMenu 현재 메뉴
 *
 * (M) x-device-language 디바이스 언어 (server)
 *
 */
export const sendLogSecondLayer = (params) => (dispatch, getState) => {
  const secondLayerInfo = getState().common.secondLayerInfo;

  if (secondLayerInfo && Object.keys(secondLayerInfo).length === 0) {
    return;
  }

  dispatch(postLog(params));
  dispatch(setSecondLayerInfo({}));
};

/**
 * IF-LGSP-LOG-005 / GNB 클릭 이력
 *
 * (M) entryMenu 진입 메뉴
 *
 * (M) inDt 진입 시간
 *
 * (M) logTpNo 로그 타입 넘버
 *
 * (M) menuMovSno 메뉴 이동 일련번호
 *
 * (M) nowMenu 현재 메뉴
 *
 * (M) outDt 진출 시간
 */
export const sendLogGNB = (menu) => (dispatch, getState) => {
  const { menuMovSno, nowMenu } = getState().common.menu;
  const secondLayerInfo = getState().common.secondLayerInfo;

  if (!menu) {
    console.log("[sendLogGNB] invalid params", menu);
    return;
  }

  if (
    ![
      LOG_MENU.SEARCH_SEARCH,
      LOG_MENU.SEARCH_RESULT,
      LOG_MENU.SEARCH_BEST_SELLER,
    ].includes(menu)
  ) {
    if (menu === nowMenu || !menuMovSno) {
      return;
    }
  }

  const newParams = {
    entryMenu: nowMenu, // previous nowMenu
    inDt: formatGMTString(new Date()),
    logTpNo: LOG_TP_NO.GNB,
    menuMovSno: `${menuMovSno}`,
    nowMenu: menu,
    outDt: "",
  };

  dispatch(setGNBMenu(menu));
  dispatch(postLog(newParams));

  if (
    [1].includes(menuMovSno) &&
    secondLayerInfo &&
    Object.keys(secondLayerInfo).length > 0
  ) {
    dispatch(
      sendLogSecondLayer({
        ...secondLayerInfo,
        entryMenu: nowMenu,
        nowMenu: menu,
      })
    );
    dispatch(
      sendLogDeepLinkFlag({
        deeplinkId: secondLayerInfo.deeplinkId,
        flag: secondLayerInfo.deeplinkId ? "Y" : "N",
      })
    );
  }
};

/**
 * IF-LGSP-LOG-006 / 상품 상세 이력
 *
 * (M) befPrice 할인 전 가격
 *
 * (O) curationId 큐레이션 아이디
 *
 * (O) curationNm 큐레이션 이름
 *
 * (M) entryMenu 진입 메뉴
 *
 * (O) expsOrd 노출 순번
 *
 * (O) inDt 진입 시간
 *
 * (M) lastPrice 할인 후 가격
 *
 * (O) lgCatCd 카테고리 코드
 *
 * (O) lgCatNm 카테고리 이름
 *
 * (O) linkTpCd 딥링크 타입
 *
 * (M) logTpNo 로그 타입 넘버
 *
 * (M) nowMenu 현재 메뉴
 *
 * (O) outDt 진출 시간
 *
 * (M) patncNm 파트너 이름
 *
 * (M) patnrId 파트너 아이디
 *
 * (M) prdtId 상품 아이디
 *
 * (M) prdtNm 상품 이름
 *
 * (O) revwGrd 별점
 *
 * (M) rewdAplyFlag 리워드 적용 여부
 *
 * (M) tsvFlag TSV 여부
 */
export const sendLogProductDetail = (params) => (dispatch, getState) => {
  const { logTpNo } = params;
  const { entryMenu, nowMenu } = getState().common.menu;

  const menu =
    logTpNo === LOG_TP_NO.PRODUCT.PRODUCT_DETAIL_IMAGE
      ? entryMenu
      : params?.entryMenu;

  const outDt =
    logTpNo === LOG_TP_NO.PRODUCT.PRODUCT_DETAIL_IMAGE
      ? ""
      : formatGMTString(new Date());

  const newParams = {
    ...params,
    entryMenu: menu,
    nowMenu: nowMenu,
    outDt,
  };

  dispatch(postLog(newParams));
};

/**
 * IF-LGSP-LOG-007 / Detail 상세 이력
 *
 * (O) curationId 큐레이션 아이디 (Theme의 경우 M, Hotel의 경우 O)
 *
 * (O) curationNm 큐레이션 이름 (Theme의 경우 M, Hotel의 경우 O)
 *
 * (M) entryMenu 진입 메뉴
 *
 * (O) inDt 진입 시간
 *
 * (O) linkTpCd 딥링크 타입
 *
 * (M) logTpNo 로그 타입 넘버
 *
 * (M) nowMenu 현재 메뉴
 *
 * (O) outDt 진출 시간
 *
 * (M) patncNm 파트너 이름
 *
 * (M) patnrId 파트너 아이디
 */
export const sendLogDetail = (params) => (dispatch, getState) => {
  const { logTpNo, patncNm, patnrId } = params;
  const { entryMenu, nowMenu } = getState().common.menu;

  if (!logTpNo || !patncNm || !patnrId) {
    console.log("[sendLogDetail] invalid params", params);
    return;
  }

  const outDt =
    logTpNo === LOG_TP_NO.DETAIL.DETAIL_BUTTON_CLICK
      ? ""
      : formatGMTString(new Date());

  const newParams = {
    ...params,
    entryMenu: entryMenu,
    nowMenu: nowMenu,
    outDt,
  };

  dispatch(postLog(newParams));
};

/**
 * IF-LGSP-LOG-008 / Shop by mobile 이력
 *
 * (M) befPrice 할인 전 가격
 *
 * (O) curationId 큐레이션 아이디
 *
 * (O) curationNm 큐레이션 이름
 *
 * (M) entryMenu 진입 메뉴
 *
 * (O) evntId 이벤트 아이디
 *
 * (O) evntNm 이벤트 이름
 *
 * (M) lastPrice 할인 후 가격
 *
 * (O) lgCatCd 카테고리 코드
 *
 * (O) lgCatNm 카테고리 이름
 *
 * (O) liveFlag 라이브 여부
 *
 * (O) locDt 디바이스 로컬 일시
 *
 * (M) logTpNo 로그 타입 넘버
 *
 * (M) mbphNoFlag 전화 번호 여부 (모바일 폰 넘버 플래그)
 *
 * (M) nowMenu 현재 메뉴
 *
 * (M) patncNm 파트너 이름
 *
 * (M) patnrId 파트너 아이디
 *
 * (O) prdtId 상품 아이디
 *
 * (O) prdtNm 상품 이름
 *
 * (O) revwGrd 별점 (리뷰 그레이드)
 *
 * (M) rewdAplyFlag 리워드 적용 여부
 *
 * (M) shopByMobileFlag 샵 바이 모바일 여부
 *
 * (M) shopTpNm 샵 바이 모바일 타입 이름
 *
 * (O) showId 방송 아이디
 *
 * (O) showNm 방송 이름
 *
 * (M) trmsAgrFlag 약관 동의 여부
 *
 * (M) tsvFlag TSV 여부
 */
export const sendLogShopByMobile = (params) => (dispatch, getState) => {
  const { logTpNo } = params;
  const { entryMenu, nowMenu } = getState().common.menu;

  const newParams = {
    ...params,
    entryMenu: entryMenu,
    logTpNo,
    nowMenu: nowMenu,
  };

  dispatch(postLog(newParams));
};

/**
 * IF-LGSP-LOG-009 / Partners 클릭 이력
 *
 * (M) entryMenu 진입 메뉴
 *
 * (M) logTpNo 로그 타입 넘버
 *
 * (M) nowMenu 현재 메뉴
 *
 * (M) patncNm 파트너 네임
 *
 * (M) patnrId 파트너 아이디
 */
export const sendLogPartners = (params) => (dispatch, getState) => {
  const { patncNm, patnrId } = params;
  const { entryMenu, nowMenu } = getState().common.menu;

  if (!patncNm || !patnrId) {
    console.log("[sendLogPartners] invalid params", params);
    return;
  }

  const newParams = {
    entryMenu: entryMenu,
    logTpNo: LOG_TP_NO.PARTNERS,
    nowMenu: nowMenu,
    patncNm,
    patnrId,
  };

  dispatch(postLog(newParams));
};

/**
 * IF-LGSP-LOG-010 / Reminder - Alert On/Off
 *
 * (M) alertFlag 설정 여부, On / Off
 *
 * (M) entryMenu 진입 메뉴
 *
 * (M) logTpNo 로그 타입 넘버
 *
 * (M) nowMenu 현재 메뉴
 */
export const sendLogMyPageAlertFlag = (params) => (dispatch, getState) => {
  const { alertFlag } = params;
  const { entryMenu, nowMenu } = getState().common.menu;

  if (!alertFlag) {
    console.log("[sendLogMyPageAlertFlag] invalid params", params);
    return;
  }

  const newParams = {
    alertFlag,
    entryMenu: entryMenu,
    logTpNo: LOG_TP_NO.MY_PAGE_ALERT_FLAG,
    nowMenu: nowMenu,
  };

  dispatch(postLog(newParams));
};

/**
 * IF-LGSP-LOG-011 / My Page Delete 버튼 클릭 이력
 *
 * (M) cnt 삭제 개수
 *
 * (M) entryMenu 진입 메뉴
 *
 * (M) logTpNo 로그 타입 넘버
 *
 * (M) nowMenu 현재 메뉴
 */
export const sendLogMyPageMyDelete = (params) => (dispatch, getState) => {
  const { cnt } = params;
  const { entryMenu, nowMenu } = getState().common.menu;

  if (!cnt) {
    console.log("[sendLogMyPageMyDelete] invalid params", params);
    return;
  }

  const newParams = {
    ...params,
    entryMenu: entryMenu,
    logTpNo: LOG_TP_NO.MY_PAGE_MY_DELETE,
    nowMenu: nowMenu,
  };

  dispatch(postLog(newParams));
};

/**
 * IF-LGSP-LOG-012 / My Page Notice View
 *
 * (M) entryMenu 진입 메뉴
 *
 * (M) itemId Notice/FAQ 등록 번호
 *
 * (M) logTpNo 로그 타입 넘버
 *
 * (M) nowMneu 현재 메뉴
 *
 * (M) title Notice/FAQ 제목
 */
export const sendLogMyPageNotice = (params) => (dispatch, getState) => {
  const { itemId, title } = params;
  const { entryMenu, nowMenu } = getState().common.menu;

  if (!itemId || !title) {
    console.log("[sendLogNoticeView] invalid params", params);
    return;
  }

  const newParams = {
    ...params,
    entryMenu: entryMenu,
    logTpNo: LOG_TP_NO.MY_PAGE_NOTICE,
    nowMenu: nowMenu,
  };

  dispatch(postLog(newParams));
};

/**
 * IF-LGSP-LOG-013 / 검색 이력
 *
 * (M) entryMenu 진입 메뉴
 *
 * (M) inputFlag 입력 구분, keyword / input
 *
 * (M) itemCnt 상춤 개수
 *
 * (M) keyword 검색어
 *
 * (M) logTpNo 로그 타입 넘버
 *
 * (M) nowMenu 현재 메뉴
 *
 * (M) showCnt 영상 개수
 *
 * (M) themeCnt 테마 개수
 */
export const sendLogSearch = (params) => (dispatch, getState) => {
  const { inputFlag, itemCnt, keyword, showCnt, themeCnt } = params;
  const { entryMenu, nowMenu } = getState().common.menu;

  if (!inputFlag || !itemCnt || !keyword || !showCnt || !themeCnt) {
    console.log("[sendLogSearch] invalid params", params);
    return;
  }

  const newParams = {
    ...params,
    entryMenu: entryMenu,
    logTpNo: LOG_TP_NO.SEARCH,
    nowMenu: nowMenu,
  };

  dispatch(postLog(newParams));
};

/**
 * IF-LGSP-LOG-014 / 검색 결과 클릭 이력
 *
 * (O) curationId 큐레이션 아이디
 *
 * (O) curationNm 큐레이션 이름
 *
 * (O) dcAfPrice 할인후 가격
 *
 * (M) entryMenu 진입 메뉴
 *
 * (M) keyword 검색어
 *
 * (O) lgCatNm LG 카테고리 이름
 *
 * (M) logTpNo 로그 타입 넘버
 *
 * (M) nowMenu 현재 메뉴
 *
 * (M) patncNm 파트너 이름
 *
 * (M) patnrId 파트너 아이디
 *
 * (O) prdtId 상품 아이디
 *
 * (O) prdtNm 상품 이름
 *
 * (O) showId 방송 아이디
 *
 * (O) showNm 방송 이름
 */
export const sendLogSearchClick = (params) => (dispatch, getState) => {
  const { keyword, patncNm, patnrId } = params;
  const { entryMenu, nowMenu } = getState().common.menu;

  if (!keyword || !patncNm || !patnrId) {
    console.log("[sendLogSearchClick] invalid params", params);
    return;
  }

  const newParams = {
    curationId: params?.curationId ?? "",
    curationNm: params?.curationNm ?? "",
    dcAfPrice: params?.dcAfPrice ?? "",
    entryMenu: entryMenu,
    keyword,
    lgCatNm: params?.lgCatNm ?? "",
    logTpNo: LOG_TP_NO.SEARCH_CLICK,
    nowMenu: nowMenu,
    patncNm,
    patnrId,
    prdtId: params?.prdtId ?? "",
    prdtNm: params?.prdtNm ?? "",
    showId: params?.showId ?? "",
    showNm: params?.showNm ?? "",
  };

  dispatch(postLog(newParams));
};

/**
 * IF-LGSP-LOG-015 / Upcoming On/Off
 *
 * (M) alertFlag 알림 설정 여부 On/Off
 *
 * (M) entryMenu 진입 메뉴
 *
 * (O) hstNm 호스트 이름
 *
 * (M) logTpNo 로그 타입 넘버
 *
 * (O) lgCatCd 카테고리 코드
 *
 * (O) lgCatNm 카테고리 이름
 *
 * (M) nowMenu 현재 메뉴
 *
 * (M) patncNm 파트너 이름
 *
 * (M) patnrId 파트너 아이디
 *
 * (M) remainSec 남은 시간(초)
 *
 * (M) showId 방송 아이디
 *
 * (M) showNm 방송 이름
 */
export const sendLogUpcomingFlag = (params) => (dispatch, getState) => {
  const { items } = params;
  const { entryMenu, nowMenu } = getState().common.menu;

  if (!items) {
    console.log("[sendLogUpcomingFlag] invalid params", params);
    return;
  }

  const newParams = {
    ...params,
    entryMenu: entryMenu,
    logTpNo: LOG_TP_NO.UPCOMING_FLAG,
    nowMenu: nowMenu,
  };

  dispatch(postLog(newParams));
};

/**
 * IF-LGSP-LOG-017 / 알람 팝업
 *
 * (M) alarmDt 알람 방생 시간
 *
 * (M) alarmType 알람 유형 Upcoming/Keyword
 *
 * (M) cnt 키워드 개수
 *
 * (M) entryMenu 진입 메뉴
 *
 * (O) hstNm 호스트 이름
 *
 * (O) lgCatCd 카테고리 코드
 *
 * (O) lgCatNm 카테고리 이름
 *
 * (M) logTpNo 로그 타입 넘버
 *
 * (M) nowMenu 현재 메뉴
 *
 * (M) patncNm 파트너 이름
 *
 * (M) patnrId 파트너 아이디
 *
 * (M) showId 방송 아이디
 *
 * (M) showNm 방송 이름
 */
export const sendLogAlarmPop = (params) => (dispatch, getState) => {
  const { alarmDt, alarmType, cnt, patncNm, patnrId, showId, showNm } = params;
  const { entryMenu, nowMenu } = getState().common.menu;

  if (
    !alarmDt ||
    !alarmType ||
    !cnt ||
    !patncNm ||
    !patnrId ||
    !showId ||
    !showNm
  ) {
    console.log("[sendLogAlarmPop] invalid params", params);
    return;
  }

  const newParams = {
    ...params,
    entryMenu: entryMenu,
    hstNm: params?.hstNm ?? "",
    lgCatCd: params?.lgCatCd ?? "",
    lgCatNm: params?.lgCatNm ?? "",
    logTpNo: LOG_TP_NO.ALARM_POP,
    nowMenu: nowMenu,
  };

  dispatch(postLog(newParams));
};

/**
 * IF-LGSP-LOG-018 / 알람 팝업 OK/NO 클릭
 *
 * (M) alarmDt 알람 발생 시간
 *
 * (M) alarmType 알람 유형 Upcoming/Keyword
 *
 * (M) clickFlag 클릭 유형 Ok/No
 *
 * (M) cnt 키워드 개수
 *
 * (M) entryMenu 진입 메뉴
 *
 * (O) hstNm 호스트 이름
 *
 * (M) keywordList 키워드 리스트(콤마 구분자)
 *
 * (O) lgCatCd 카테고리 코드
 *
 * (O) lgCatNm 카테고리 이름
 *
 * (M) logTpNo 로그 타입 넘버
 *
 * (M) nowMenu 현재 메뉴
 *
 * (M) patncNm 파트너 이름
 *
 * (M) patnrId 파트너 아이디
 *
 * (M) showId 방송 아이디
 *
 * (M) showNm 방송 이름
 */
export const sendLogAlarmClick = (params) => (dispatch, getState) => {
  const { alarmDt, alarmType, clickFlag, cnt, logTpNo, patnrId, showId } =
    params;
  const { entryMenu, nowMenu } = getState().common.menu;

  if (
    !alarmDt ||
    !alarmType ||
    !clickFlag ||
    !cnt ||
    !logTpNo ||
    !patnrId ||
    !showId
  ) {
    console.log("[sendLogAlarmClick] invalid params", params);
    return;
  }

  const newParams = {
    ...params,
    entryMenu: entryMenu,
    hstNm: params?.hstNm ?? "",
    lgCatCd: params?.lgCatCd ?? "",
    lgCatNm: params?.lgCatNm ?? "",
    nowMenu: nowMenu,
  };

  dispatch(postLog(newParams));
};

/**
 * IF-LGSP-LOG-020 / 테마 상품 클릭 이력
 *
 * (M) befPrice 할인 전 가격
 *
 * (M) curationId 큐레이션 아이디
 *
 * (M) curationNm 큐레이션 이름
 *
 * (M) entryMenu 진입 메뉴
 *
 * (M) lastPrice 할인 후 가격
 *
 * (M) lgCatCd 카테고리 코드
 *
 * (M) lgCatNm 카테고리 이름
 *
 * (O) linkTpCd 딥링크 타입
 *
 * (M) logTpNo 로그 타입 넘버
 *
 * (M) nowMenu 현재 메뉴
 *
 * (M) patncNm 파트너 이름
 *
 * (M) patnrId 파트너 아이디
 *
 * (M) prdtExpsOrd 상품 노출 순번
 *
 * (M) prdtId 상품 아이디
 *
 * (M) prdtNm 상품 이름
 *
 * (M) rewdAplyFlag 리워드 적용 여부
 *
 * (M) shelfExpsOrd 쉘프 노출 순번
 *
 * (M) shelfId 쉘프 아이디
 *
 * (M) shelfNm 쉘프 이름
 *
 * (M) tsvFlag TSV 여부
 */
export const sendLogThemeProduct = (params) => (dispatch, getState) => {
  const { entryMenu, nowMenu } = getState().common.menu;
  const newParams = {
    ...params,
    entryMenu: entryMenu,
    logTpNo: LOG_TP_NO.THEME_PRODUCT,
    nowMenu: nowMenu,
  };

  dispatch(postLog(newParams));
};

/**
 * IF-LGSP-LOG-100 / TOP contents 노출 이력
 *
 * (M) banrNo 배너 번호
 *
 * (O) banrTpNm 배너 유형 이름, Vertical / Horizontal
 *
 * (M) contId 컨텐츠 아이디
 *
 * (M) contNm 컨텐츠 이름
 *
 * (M) contTpNm 컨텐츠 타입 이름, live / image / Today's deals
 *
 * (M) dspyTpNm 디스플레이 유형 이름, Random / Rolling
 *
 * (M) entryMenu 진입 메뉴
 *
 * (M) expsOrd 노출 순서
 *
 * (M) inDt 진입 시간
 *
 * (O) linkTpCd 딥링크 타입
 *
 * (M) logTpNo 로그 타입 넘버
 *
 * (M) nowMenu 현재 메뉴
 *
 * (M) outDt 진출 시간
 *
 * (O) patncNm 파트너 이름
 *
 * (O) patnrId 파트너 아이디
 *
 * (M) tmplCd 템플릿 코드 DSP002 01~03
 */
export const sendLogTopContents = (params) => (dispatch, getState) => {
  const { entryMenu, nowMenu } = getState().common.menu;
  const newParams = {
    ...params,
    entryMenu: params?.entryMenu ?? entryMenu,
    outDt: formatGMTString(new Date()),
    nowMenu: params?.nowMenu ?? nowMenu,
  };

  dispatch(postLog(newParams));
};

/**
 * IF-LGSP-LOG-101 / 약관 동의, 미동의 클릭 이력
 *
 * (M) entryMenu 진입 메뉴
 *
 * (M) logTpNo 로그 타입 넘버
 *
 * (M) nowMenu 현재 메뉴
 */
export const sendLogTerms = (params) => (dispatch, getState) => {
  const { logTpNo } = params;
  const { entryMenu, nowMenu } = getState().common.menu;

  if (!logTpNo) {
    console.log("[sendLogTerms] invalid params", params);
    return;
  }

  const newParams = {
    entryMenu: entryMenu,
    logTpNo,
    nowMenu: nowMenu,
  };

  dispatch(postLog(newParams));
};

/**
 * IF-LGSP-LOG-102 / LG Account 로그인 이력
 *
 * (M) entryMenu 진입 메뉴
 *
 * (M) nowMenu 현재 메뉴
 *
 * (M) lginTpNm 로그인 타입 이름 TV/ShopTime
 *
 * (M) logTpNo 로그 타입 넘버
 *
 * (M) usrNo 사용자 번호
 */
export const sendLogLgAccountLogin = (params) => (dispatch, getState) => {
  const { lginTpNm, usrNo } = params;
  const { entryMenu, nowMenu } = getState().common.menu;

  if (!lginTpNm || !usrNo) {
    console.log("[sendLogLgAccountLogin] invalid params", params);
    return;
  }

  const newParams = {
    ...params,
    entryMenu: entryMenu,
    logTpNo: LOG_TP_NO.LG_ACCOUNT_LOGIN,
    nowMenu: nowMenu,
  };

  dispatch(postLog(newParams));
};

/**
 * IF-LGSP-LOG-103 / Order 화면 버튼 클릭 이력
 *
 * (M) btnNm 버튼 이름
 *
 * (M) entryMenu 진입 메뉴
 *
 * (M) logTpNo 로그 타입 넘버
 *
 * (M) nowMenu 현재 메뉴
 *
 */
export const sendLogOrderBtnClick = (params) => (dispatch, getState) => {
  const { btnNm } = params;
  const { entryMenu, nowMenu } = getState().common.menu;

  if (!btnNm) {
    console.log("[sendLogOrderBtnClick] invalid params", params);
    return;
  }

  const newParams = {
    ...params,
    entryMenu: entryMenu,
    logTpNo: LOG_TP_NO.ORDER_BTN_CLICK,
    nowMenu: nowMenu,
  };

  dispatch(postLog(newParams));
};

/**
 * IF-LGSP-LOG-104 / Order 취소/반품/교환 이력 (반품/교환 삭제)
 *
 * (M) entryMenu 진입 메뉴
 *
 * (M) logTpNo 로그 타입 넘버
 *
 * (M) nowMenu 현재 메뉴
 *
 * (M) reqRsn 요청 사유
 *
 * (M) reqTpNm 요청 유형 이름 ("Cancel", "Return", "Exchange")
 *
 */
export const sendLogOrderChange = (params) => (dispatch, getState) => {
  const { reqRsn, reqTpNm } = params;
  const { entryMenu, nowMenu } = getState().common.menu;

  if (!reqRsn || !reqTpNm) {
    console.log("[sendLogOrderChange] invalid params", params);
    return;
  }

  const newParams = {
    ...params,
    entryMenu: entryMenu,
    logTpNo: LOG_TP_NO.ORDER_CHANGE,
    nowMenu: nowMenu,
  };

  dispatch(postLog(newParams));
};

/**
 * IF-LGSP-LOG-105 / 쿠폰 사용 이력
 *
 * (M) cpnSno 쿠폰 일련 번호
 *
 * (M) cpnTtl 쿠폰 제목
 *
 * (M) entryMenu 진입 메뉴
 *
 * (M) lgCatCd 카테고리 코드
 *
 * (M) lgCatNm 카테고리 이름
 *
 * (M) logTpNo 로그 타입 넘버
 *
 * (M) nowMenu 현재 메뉴
 *
 * (M) patncNm 파트너 이름
 *
 * (M) patnrId 파트너 아이디
 *
 * (M) prodId 상품 아이디
 *
 * (M) prodNm 상품 이름
 */
export const sendLogCouponUse = (params) => (dispatch, getState) => {
  // const {} = params
  const { entryMenu, nowMenu } = getState().common.menu;
  // if() {
  //   console.log('[sendLogCouponUse] invalid params', params)
  // }

  const newParams = {
    ...params,
    entryMenu: entryMenu,
    logTpNo: LOG_TP_NO.COUPON_USE,
    nowMenu: nowMenu,
  };

  // dispatch(postLog(newParams));
};

/**
 * IF-LGSP-LOG-108 / 결제 페이지 진입 이력
 *
 * (M) cartTpSno 장바구니 구분 일련번호 ("사용자ID_상품ID_일련번호")
 *
 * (M) cpnSno 쿠폰 일련번호
 *
 * (M) cpnTtl 쿠폰 제목
 *
 * (M) dcAftrPrc 할인 후 가격
 *
 * (M) dcBefPrc 할인 전 가격
 *
 * (M) entryMenu 진입 메뉴
 *
 * (M) lgCatCd 카테고리 코드
 *
 * (M) lgCatNm 카테고리 이름
 *
 * (M) logTpNo 로그 타입 넘버
 *
 * (M) nowMenu 현재 메뉴
 *
 * (M) patncNm 파트너 이름
 *
 * (M) patnrId 파트너 아이디
 *
 * (M) prodId 상품 아이디
 *
 * (M) prodNm 상품 이름
 *
 * (M) prodOptSno 상품 옵션 일련번호
 *
 * (M) qty 수량
 */
export const sendLogPaymentEntry = (params) => (dispatch, getState) => {
  const {
    cartTpSno,
    dcAftrPrc,
    dcBefPrc,
    patncNm,
    patnrId,
    prodId,
    prodNm,
    qty,
  } = params;
  const { entryMenu, nowMenu } = getState().common.menu;

  if (
    !cartTpSno ||
    !dcAftrPrc ||
    !dcBefPrc ||
    !patncNm ||
    !patnrId ||
    !prodId ||
    !prodNm ||
    !qty
  ) {
    console.log("[sendLogPaymentEntry] invalid params", params);
    return;
  }

  const newParams = {
    ...params,
    entryMenu: entryMenu,
    logTpNo: LOG_TP_NO.PAYMENT_ENTRY,
    nowMenu: nowMenu,
  };

  dispatch(postLog(newParams));
};

/**
 * IF-LGSP-LOG-109 / 결제 완료 이력
 *
 * (M) cartTpSno 장바구니 구분 일련번호 ("사용자ID_상품ID_일련번호")
 *
 * (M) cpnSno 쿠폰 일련번호
 *
 * (M) cpnTtl 쿠폰 제목
 *
 * (M) dcAftrPrc 할인 후 가격
 *
 * (M) dcBefPrc 할인 전 가격
 *
 * (M) entryMenu 진입 메뉴
 *
 * (M) lgCatCd 카테고리 코드
 *
 * (M) lgCatNm 카테고리 이름
 *
 * (M) logTpNo 로그 타입 넘버
 *
 * (M) nowMenu 현재 메뉴
 *
 * (M) patncNm 파트너 이름
 *
 * (M) patnrId 파트너 아이디
 *
 * (M) prodId 상품 아이디
 *
 * (M) prodNm 상품 이름
 *
 * (O) prodOptSno 상품 옵션 일련번호
 *
 * (M) qty 수량
 *
 * (M) usrNo 사용자 번호
 */
export const sendLogPaymentComplete = (params) => (dispatch, getState) => {
  const {
    cartTpSno,
    dcAftrPrc,
    dcBefPrc,
    patncNm,
    patnrId,
    prodId,
    prodNm,
    qty,
    usrNo,
  } = params;
  const { entryMenu, nowMenu } = getState().common.menu;

  if (
    !cartTpSno ||
    !dcAftrPrc ||
    !dcBefPrc ||
    !patncNm ||
    !patnrId ||
    !prodId ||
    !prodNm ||
    !qty ||
    !usrNo
  ) {
    console.log("[sendLogPaymentComplete] invalid params", params);
    return;
  }

  const newParams = {
    ...params,
    entryMenu: entryMenu,
    logTpNo: LOG_TP_NO.PAYMENT_COMPLETE,
    nowMenu: nowMenu,
  };

  dispatch(postLog(newParams));
};

/**
 * IF-LGSP-LOG-110 / Featured Brands View 이력
 *
 * (O) catCd 파트너사 카테고리 코드
 *
 * (O) catNm 파트너사 카테고리 네임
 *
 * (O) crtrId 크리에이터 아이디
 *
 * (O) crtrNm 크리에이터 네임
 *
 * (M) entryMenu 진입 메뉴
 *
 * (M) logTpNo 로그 타입 넘버
 *
 * (M) nowMenu 현재 메뉴
 *
 * (M) patncNm 파트너 네임
 *
 * (M) patnrId 파트너 아이디
 *
 * (O) srsId 시리즈 아이디
 *
 * (O) srsNm 시리즈 이름
 */
export const sendLogFeaturedBrands = (params) => (dispatch, getState) => {
  const { patncNm, patnrId } = params;
  const { entryMenu, nowMenu } = getState().common.menu;

  if (!patncNm || !patnrId) {
    console.log("[sendLogFeaturedBrands] invalid params", params);
    return;
  }

  const newParams = {
    catCd: params.catCd ?? "",
    catNm: params.catNm ?? "",
    crtrId: params.crtrId ?? "",
    crtrNm: params.crtrNm ?? "",
    entryMenu: entryMenu,
    logTpNo: LOG_TP_NO.BRANDS,
    nowMenu: nowMenu,
    patncNm,
    patnrId,
    srsId: params.srsId ?? "",
    srsNm: params.srsNm ?? "",
  };

  dispatch(postLog(newParams));
};

/**
 * IF-LGSP-LOG-111 / 카드, 주소 ADD/EDIT 이력
 *
 * (M) btnNm 버튼 이름
 *
 * (M) etnryMenu 진입 메뉴
 *
 * (M) logTpNo 로그 타입 넘버
 *
 * (M) nowMenu 현재 메뉴
 */
export const sendLogMyInfoEdit = (params) => (dispatch, getState) => {
  const { btnNm } = params;
  const { entryMenu, nowMenu } = getState().common.menu;

  if (!btnNm) {
    console.log("[sendLogMyInfoEdit] invalid params", params);
    return;
  }

  const newParams = {
    ...params,
    entryMenu: entryMenu,
    logTpNo: LOG_TP_NO.MY_INFO_EDIT,
    nowMenu: nowMenu,
  };

  dispatch(postLog(newParams));
};
/**
 * IF-LGSP-LOG-112 / Check out 화면 버튼 클릭 이력
 *
 * (M) btnNm 버튼 이름
 *
 * (M) entryMenu 진입 메뉴
 *
 * (M) logTpNo 로그 타입 넘버
 *
 * (M) nowMenu 현재 메뉴
 */
export const sendLogCheckOutBtnClick = (params) => (dispatch, getState) => {
  const { btnNm } = params;
  const { entryMenu, nowMenu } = getState().common.menu;

  if (!btnNm) {
    console.log("[sendLogCheckOutBtnClick] invalid params", params);
    return;
  }

  const newParams = {
    ...params,
    entryMenu: entryMenu,
    logTpNo: LOG_TP_NO.CHECKOUT_BTN_CLICK,
    nowMenu: nowMenu,
  };

  dispatch(postLog(newParams));
};

// IF-LGSP-LOG-200 / 통합 추천 로그

export const sendLogTotalRecommend = (params) => (dispatch, getState) => {
  let localMacAddress;

  const { entryMenu } = getState().common.menu;
  const macAddress = getState().common.macAddress;
  const userNumber = getState().common.appStatus.loginUserData.userNumber;

  const macAddr = macAddress?.wired ? macAddress?.wired : macAddress?.wifi;

  if (typeof window === "object" && !window.PalmSystem) {
    localMacAddress = "00:1A:2B:3C:4D:5E";
  }

  const logCreateTime = new Date().toISOString();

  // console.log("#params", params);

  const newParams = {
    ...params,
    userNumber: userNumber,
    macAddr: macAddr ? macAddr : localMacAddress,
    entryMenu: entryMenu ? entryMenu : "APP",
    logCreateTime,
  };

  dispatch(postTotalLog(newParams));
};
