import logging
import sys

sys.path.extend(['..', '.'])
import kis_auth as ka

# 로깅 설정
logging.basicConfig(level=logging.INFO, format='%(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

##############################################################################################
# [해외주식] 실시간시세 > 해외주식 실시간호가[실시간-021]
##############################################################################################

def asking_price(
        tr_type: str,
        tr_key: str,
) -> tuple[dict, list[str]]:
    """
    해외주식 실시간호가를 이용하여 미국시세 실시간 1호가(매수/매도) 시세가 무료로 제공됩니다. (미국은 유료시세 제공 X)

    아시아 국가의 경우, HTS(efriend Plus) [7781] 시세신청(실시간) 화면에서 유료 서비스 신청 시, 
    "해외주식 실시간호가 HDFSASP0" 을 이용하여 아시아국가 유료시세(실시간호가)를 받아보실 수 있습니다. (24.11.29 반영)
    (아시아 국가 무료시세는 "해외주식 지연호가(아시아) HDFSASP1" 를 이용하시기 바랍니다.)

    Args:
        tr_type (str): [필수] 등록/해제
        tr_key (str): [필수] 종목코드

    Returns:
        message (dict): 메시지 데이터
        columns (list[str]): 컬럼 정보

    Example:
        >>> msg, columns = asking_price("1", "DNASAAPL")
        >>> print(msg, columns)
    """

    # 필수 파라미터 검증
    if tr_type == "":
        raise ValueError("tr_type is required")

    if tr_key == "":
        raise ValueError("tr_key is required")

    tr_id = "HDFSASP0"

    params = {
        "tr_key": tr_key,
    }

    msg = ka.data_fetch(tr_id, tr_type, params)

    columns = [
        "symb",
        "zdiv",
        "xymd",
        "xhms",
        "kymd",
        "khms",
        "bvol",
        "avol",
        "bdvl",
        "advl",
        "pbid1",
        "pask1",
        "vbid1",
        "vask1",
        "dbid1",
        "dask1"
    ]

    return msg, columns

##############################################################################################
# [해외주식] 실시간시세 > 해외주식 실시간체결통보[실시간-009]
##############################################################################################

def ccnl_notice(
        tr_type: str,
        tr_key: str,
        env_dv: str,
) -> tuple[dict, list[str]]:
    """
    해외주식 실시간체결통보 API입니다.

    Args:
        tr_type (str): [필수] 등록/해제
        tr_key (str): [필수] 종목코드
        env_dv (str): [필수] 실전모의구분 (ex. real:실전, demo:모의)

    Returns:
        message (dict): 메시지 데이터
        columns (list[str]): 컬럼 정보

    Example:
        >>> msg, columns = ccnl_notice("1", trenv.my_htsid, "real")
        >>> print(msg, columns)
    """

    # 필수 파라미터 검증
    if tr_type == "":
        raise ValueError("tr_type is required")

    if tr_key == "":
        raise ValueError("tr_key is required")

    if env_dv == "":
        raise ValueError("env_dv is required (e.g. 'real', 'demo')")

    # tr_id 구분
    if env_dv == "real":
        tr_id = "H0GSCNI0"
    elif env_dv == "demo":
        tr_id = "H0GSCNI9"
    else:
        raise ValueError("env_dv can only be real or demo")

    params = {
        "tr_key": tr_key,
    }

    msg = ka.data_fetch(tr_id, tr_type, params)

    columns = [
        "CUST_ID",
        "ACNT_NO",
        "ODER_NO",
        "OODER_NO",
        "SELN_BYOV_CLS",
        "RCTF_CLS",
        "ODER_KIND2",
        "STCK_SHRN_ISCD",
        "CNTG_QTY",
        "CNTG_UNPR",
        "STCK_CNTG_HOUR",
        "RFUS_YN",
        "CNTG_YN",
        "ACPT_YN",
        "BRNC_NO",
        "ODER_QTY",
        "ACNT_NAME",
        "CNTG_ISNM",
        "ODER_COND",
        "DEBT_GB",
        "DEBT_DATE",
        "START_TM",
        "END_TM",
        "TM_DIV_TP",
        "CNTG_UNPR12"
    ]

    return msg, columns

##############################################################################################
# [해외주식] 실시간시세 > 해외주식 지연호가(아시아)[실시간-008]
##############################################################################################

def delayed_asking_price_asia(
        tr_type: str,
        tr_key: str,
) -> tuple[dict, list[str]]:
    """
    해외주식 지연호가(아시아)의 경우 아시아 무료시세(지연호가)가 제공됩니다.

    HTS(efriend Plus) [7781] 시세신청(실시간) 화면에서 유료 서비스 신청 시, 
    "해외주식 실시간호가 HDFSASP0" 을 이용하여 아시아국가 유료시세(실시간호가)를 받아보실 수 있습니다. (24.11.29 반영)

    ※ 지연시세 지연시간 : 홍콩, 베트남, 중국, 일본 - 15분지연

    Args:
        tr_type (str): [필수] 등록/해제
        tr_key (str): [필수] 종목코드

    Returns:
        message (dict): 메시지 데이터
        columns (list[str]): 컬럼 정보

    Example:
        >>> msg, columns = delayed_asking_price_asia("1", "DHKS00003")
        >>> print(msg, columns)
    """

    # 필수 파라미터 검증
    if tr_type == "":
        raise ValueError("tr_type is required")

    if tr_key == "":
        raise ValueError("tr_key is required")

    tr_id = "HDFSASP1"

    params = {
        "tr_key": tr_key,
    }

    msg = ka.data_fetch(tr_id, tr_type, params)

    columns = [
        "symb",
        "zdiv",
        "xymd",
        "xhms",
        "kymd",
        "khms",
        "bvol",
        "avol",
        "bdvl",
        "advl",
        "pbid1",
        "pask1",
        "vbid1",
        "vask1",
        "dbid1",
        "dask1"
    ]

    return msg, columns

##############################################################################################
# [해외주식] 실시간시세 > 해외주식 실시간지연체결가[실시간-007]
##############################################################################################

def delayed_ccnl(
        tr_type: str,
        tr_key: str,
) -> tuple[dict, list[str]]:
    """
    해외주식 실시간지연체결가의 경우 기본적으로 무료시세(지연체결가)가 제공되며, 
    아시아국가의 경우 HTS(efriend Plus) [7781] 시세신청(실시간) 화면에서 유료 서비스 신청 시 API로도 유료시세(실시간체결가)를 받아보실 수 있습니다. (24.11.29 반영)

    ※ 지연시세 지연시간 : 미국 - 실시간무료(0분지연) / 홍콩, 베트남, 중국, 일본 - 15분지연 (중국은 실시간시세 신청 시 무료실시간시세 제공)
    미국의 경우 0분지연시세로 제공되나, 장중 당일 시가는 상이할 수 있으며, 익일 정정 표시됩니다.

    해당 API로 미국주간거래(10:00~16:00) 시세 조회도 가능합니다. 
    ※ 미국주간거래 실시간 조회 시, 맨 앞자리(R), tr_key 중 시장구분 값을 다음과 같이 입력 → 나스닥: BAQ, 뉴욕: BAY, 아멕스: BAA

    Args:
        tr_type (str): [필수] 등록/해제
        tr_key (str): [필수] 종목코드

    Returns:
        message (dict): 메시지 데이터
        columns (list[str]): 컬럼 정보

    Example:
        >>> msg, columns = delayed_ccnl("1", "DNASAAPL")
        >>> print(msg, columns)
    """

    # 필수 파라미터 검증
    if tr_type == "":
        raise ValueError("tr_type is required")

    if tr_key == "":
        raise ValueError("tr_key is required")

    tr_id = "HDFSCNT0"

    params = {
        "tr_key": tr_key,
    }

    msg = ka.data_fetch(tr_id, tr_type, params)

    columns = [
        "SYMB",
        "ZDIV",
        "TYMD",
        "XYMD",
        "XHMS",
        "KYMD",
        "KHMS",
        "OPEN",
        "HIGH",
        "LOW",
        "LAST",
        "SIGN",
        "DIFF",
        "RATE",
        "PBID",
        "PASK",
        "VBID",
        "VASK",
        "EVOL",
        "TVOL",
        "TAMT",
        "BIVL",
        "ASVL",
        "STRN",
        "MTYP"
    ]

    return msg, columns

