import Spotlight from "@enact/spotlight";

import { URLS } from "../api/apiConfig";
import { TAxios } from "../api/TAxios";
import { panel_names } from "../utils/Config";
import { types } from "./actionTypes";
import { popPanel, pushPanel, updatePanel } from "./panelActions";

//yhcho
/*
      dispatch(startVideoPreview({
        patnrId: randomData.patnrId,
            showId: randomData.showId,
            shptmBanrTpNm: randomData.shptmBanrTpNm,
            lgCatCd: randomData.lgCatCd,
            modal: true,
            modalContainerRef: videoModalContainerRef.current, //to calc width, height, left, top
            modalClassName:css.videoModal
      }));

      modalClassName: modal more class info and checking it's launched from preview mode
*/
let startVideoTimer = null;
//start modal mode
//start Full -> modal mode
let startVideoFocusTimer = null;
export const startVideoPlayer =
  ({ modal, modalContainerId, modalClassName, spotlightDisable, useNewPlayer, ...rest }) =>
  (dispatch, getState) => {
    const panels = getState().panels.panels;
    const topPanel = panels[panels.length - 1];
    let panelWorkingAction = pushPanel;
    
    const panelName = useNewPlayer ? panel_names.PLAYER_PANEL_NEW : panel_names.PLAYER_PANEL;

    if (topPanel && topPanel.name === panelName) {
      panelWorkingAction = updatePanel;
    }
    dispatch(
      panelWorkingAction(
        {
          name: panelName,
          panelInfo: {
            modal,
            modalContainerId,
            modalClassName,
            ...rest,
          },
        },
        true
      )
    );
    if (modal && modalContainerId && !spotlightDisable) {
      Spotlight.setPointerMode(false);
      startVideoFocusTimer = setTimeout(() => {
        Spotlight.focus(modalContainerId);
      }, 0);
    }
  };
export const finishVideoPreview = () => (dispatch, getState) => {
  const panels = getState().panels.panels;
  const topPanel = panels[panels.length - 1];
  if (topPanel && topPanel.name === panel_names.PLAYER_PANEL && topPanel.panelInfo.modal) {
    if (startVideoFocusTimer) {
      clearTimeout(startVideoFocusTimer);
      startVideoFocusTimer = null;
    }
    dispatch(popPanel());
  }
};
// 채팅 로그 가져오기 IF-LGSP-371
export const getChatLog =
  ({ patnrId, showId }) =>
  (dispatch, getState) => {
    const onSuccess = (response) => {
      console.log("getChatLog onSuccess", response.data);

      dispatch({
        type: types.GET_CHAT_LOG,
        payload: response.data.data,
      });
    };

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

    TAxios(dispatch, getState, "get", URLS.CHAT_LOG, { patnrId, showId }, {}, onSuccess, onFail);
  };

// VOD 자막 가져오기 IF-LGSP-072
export const getSubTitle =
  ({ showSubtitleUrl }) =>
  (dispatch, getState) => {
    const onSuccess = (response) => {
      console.log("getSubTitle onSuccess", response.data);

      dispatch({
        type: types.GET_SUBTITLE,
        payload: { url: showSubtitleUrl, data: response.data.data },
      });
    };

    const onFail = (error) => {
      console.error("getSubTitle onFail", error);
      dispatch({
        type: types.GET_SUBTITLE,
        payload: { url: showSubtitleUrl, data: "Error" },
      });
    };

    if (!getState().play.subTitleBlobs[showSubtitleUrl]) {
      TAxios(dispatch, getState, "get", URLS.SUBTITLE, { showSubtitleUrl }, {}, onSuccess, onFail);
    } else {
      console.log("playActions getSubTitle no Nothing it's exist", showSubtitleUrl);
    }
  };

export const CLEAR_PLAYER_INFO = () => ({
  type: types.CLEAR_PLAYER_INFO,
});

/* 🔽 [추가] 새로운 '플레이 제어 매니저' 액션들 */

/**
 * 비디오 재생 제어권을 요청합니다.
 * 컴포넌트는 이 액션을 통해 중앙 매니저에게 재생을 '요청'합니다.
 * @param {string} ownerId - 제어권을 요청하는 컴포넌트의 고유 ID (예: 'banner0_persistent')
 * @param {object} videoInfo - 재생할 비디오 정보 (url, id 등)
 */
export const requestPlayControl = (ownerId, videoInfo) => (dispatch, getState) => {
    const { playerControl } = getState().home;
    const currentOwnerId = playerControl.ownerId;

    if (currentOwnerId === ownerId) return; // 이미 제어권 소유

    if (currentOwnerId) {
        // 현재 제어중인 컴포넌트가 영구재생 배너이면 '일시정지'
        if (currentOwnerId === 'banner0_persistent') {
            dispatch(pausePlayerControl());
        } else {
            // 다른 미리보기라면 완전히 숨김
            dispatch(releasePlayControl(currentOwnerId, true));
        }
    }
    
    // 1. 매니저 상태 업데이트
    dispatch({ type: types.SET_PLAYER_CONTROL, payload: { ownerId } });
    
    // 2. 공유 PlayerPanel의 상태 업데이트
    dispatch(updatePanel({
        name: panel_names.PLAYER_PANEL,
        panelInfo: {
            isHidden: false,
            modal: true,
            ...videoInfo
        }
    }));
};

/**
 * 비디오 재생 제어권을 해제하고, 필요시 영구재생 비디오를 복원합니다.
 * @param {string} ownerId - 제어권을 해제하는 컴포넌트의 고유 ID
 * @param {boolean} fromPreemption - 다른 요청에 의해 강제로 중단되었는지 여부
 */
export const releasePlayControl = (ownerId, fromPreemption = false) => (dispatch, getState) => {
    const { playerControl } = getState().home;

    if (fromPreemption || playerControl.ownerId === ownerId) {
        // 1. 공유 PlayerPanel을 다시 숨김
        dispatch(updatePanel({
            name: panel_names.PLAYER_PANEL,
            panelInfo: {
                isHidden: true,
            }
        }));

        // 2. 매니저 상태 업데이트 (현재 소유주 없음)
        dispatch({ type: types.CLEAR_PLAYER_CONTROL });

        // 3. 만약 '일시정지'된 영구재생 비디오가 있었다면, 제어권을 되돌려주고 다시 재생
        if (playerControl.isPaused && playerControl.ownerId === 'banner0_persistent') {
            const persistentVideoInfo = { /* 영구 비디오 정보를 가져오는 로직 (필요시) */ };
            dispatch(requestPlayControl('banner0_persistent', persistentVideoInfo));
        }
    }
};

/**
 * 현재 재생 중인 비디오를 '일시정지' 상태로 변경하는 액션.
 * 이 함수는 플레이어 패널을 닫지 않고, 단순히 비디오 재생을 멈추는 신호를 보냅니다.
 *
 * @param {string} ownerId - 비디오 제어권을 가진 컴포넌트의 고유 ID.
 */
// export const pausePlayerControl = (ownerId) => (dispatch, getState) => {
//   const { playerControl } = getState().home;

//   // 제어권을 가진 컴포넌트가 자신일 경우에만 일시정지
//   if (playerControl.ownerId === ownerId) {
//     dispatch({
//       type: types.PAUSE_PLAYER_CONTROL,
//     });
//   }
// };

/**
 * '일시정지' 상태의 비디오를 다시 재생하는 액션.
 *
 * @param {string} ownerId - 비디오 제어권을 가진 컴포넌트의 고유 ID.
 */
export const resumePlayerControl = (ownerId) => (dispatch, getState) => {
  const { playerControl } = getState().home;

  // 제어권을 가진 컴포넌트가 자신이고, 일시정지 상태일 때만 재개
  if (playerControl.ownerId === ownerId && playerControl.isPaused) {
    dispatch({
      type: types.RESUME_PLAYER_CONTROL,
    });
  }
};

/**
 * 공유 PlayerPanel을 전체화면 모드로 전환합니다.
 * 이 액션은 어떤 배너에서든 클릭 시 호출됩니다.
 */
export const goToFullScreen = () => (dispatch, getState) => {
    // 공유 PlayerPanel의 'modal' 상태를 false로 변경하여 전체화면으로 전환
    dispatch(updatePanel({
        name: panel_names.PLAYER_PANEL,
        panelInfo: {
            modal: false,
            isHidden: false, // 혹시 숨겨져 있었다면 보이도록
        }
    }));
};


/**
 * 영구재생 비디오를 일시정지 상태로 만듭니다. (내부 사용)
 */
export const pausePlayerControl = () => ({
    type: types.PAUSE_PLAYER_CONTROL
});


/**
 * 전체화면 플레이어에서 미리보기 상태로 복귀할 때 호출됩니다.
 * 중앙 'playerControl' 상태를 확인하여 올바른 위치와 비디오로 복원합니다.
 */
export const returnToPreview = () => (dispatch, getState) => {
  const { playerControl } = getState().home;

  let targetOwnerId;
  let targetVideoInfo;

  // 만약 '일시정지'된 영구재생 비디오가 있다면, 무조건 그 비디오로 복귀하는 것이 최우선
  if (playerControl.isPaused) {
    targetOwnerId = 'banner0_persistent';
    // targetVideoInfo = ... (0번 배너의 비디오 정보를 가져오는 로직)
  } else {
    // 그렇지 않다면, 전체화면으로 가기 직전의 소유주(ownerId)에게로 복귀
    targetOwnerId = playerControl.ownerId;
    // targetVideoInfo = ... (해당 ownerId의 비디오 정보를 가져오는 로직)
  }

  // 매니저에게 해당 타겟으로 재생을 다시 요청
  if (targetOwnerId) {
    dispatch(requestPlayControl(targetOwnerId, targetVideoInfo));
  } else {
    // 돌아갈 곳이 없으면 그냥 플레이어를 닫음
    dispatch(finishVideoPreview());
  }
};