from kiwoom_rest_api.core.base_api import KiwoomBaseAPI
from typing import Union, Dict, Any, Awaitable

class SecuritiesLendingAndBorrowing(KiwoomBaseAPI):
    """한국 주식 대차거래 관련 API를 제공하는 클래스"""
    
    def __init__(
        self, 
        base_url: str = None, 
        token_manager=None, 
        use_async: bool = False,
        resource_url: str = "/api/dostk/slb"
    ):
        """
        SecuritiesLendingAndBorrowing 클래스 초기화
        
        Args:
            base_url (str, optional): API 기본 URL
            token_manager: 토큰 관리자 객체
            use_async (bool): 비동기 클라이언트 사용 여부 (기본값: False)
        """
        super().__init__(
            base_url=base_url,
            token_manager=token_manager,
            use_async=use_async,
            resource_url=resource_url
        )
             
    def stock_lending_trend_request_ka10068(
        self,
        strt_dt: str = "",
        end_dt: str = "",
        all_tp: str = "1",
        cont_yn: str = "N",
        next_key: str = "",
    ) -> dict:
        """대차거래추이를 요청합니다.

        Args:
            strt_dt (str, optional): 시작일자 (YYYYMMDD). Defaults to "".
            end_dt (str, optional): 종료일자 (YYYYMMDD). Defaults to "".
            all_tp (str, optional): 전체구분 (1: 전체표시). Defaults to "1".
            cont_yn (str, optional): 연속조회여부. Defaults to "N".
            next_key (str, optional): 연속조회키. Defaults to "".

        Returns:
            dict: 대차거래추이 데이터
                {
                    "dbrt_trde_trnsn": list,  # 대차거래추이 리스트
                        [
                            {
                                "dt": str,  # 일자
                                "dbrt_trde_cntrcnt": str,  # 대차거래체결주수
                                "dbrt_trde_rpy": str,  # 대차거래상환주수
                                "dbrt_trde_irds": str,  # 대차거래증감
                                "rmnd": str,  # 잔고주수
                                "remn_amt": str,  # 잔고금액
                            }
                        ],
                    "return_code": int,  # 응답코드
                    "return_msg": str,  # 응답메시지
                }

        Example:
            >>> from kiwoom_rest_api import KiwoomRestAPI
            >>> api = KiwoomRestAPI()
            >>> result = api.slb.stock_lending_trend_request_ka10068(
            ...     strt_dt="20250401",
            ...     end_dt="20250430",
            ...     all_tp="1"
            ... )
            >>> print(result)
        """
        headers = {
            "cont-yn": cont_yn,
            "next-key": next_key,
            "api-id": "ka10068",
        }

        data = {
            "strt_dt": strt_dt,
            "end_dt": end_dt,
            "all_tp": all_tp,
        }

        return self._execute_request(
            "POST",
            json=data,
            headers=headers,
        )
        
    def top10_stock_lending_request_ka10069(
        self,
        strt_dt: str,
        end_dt: str = "",
        mrkt_tp: str = "001",
        cont_yn: str = "N",
        next_key: str = "",
    ) -> dict:
        """대차거래상위10종목을 요청합니다.

        Args:
            strt_dt (str): 시작일자 (YYYYMMDD 형식)
            end_dt (str, optional): 종료일자 (YYYYMMDD 형식). Defaults to "".
            mrkt_tp (str, optional): 시장구분 (001:코스피, 101:코스닥). Defaults to "001".
            cont_yn (str, optional): 연속조회여부. Defaults to "N".
            next_key (str, optional): 연속조회키. Defaults to "".

        Returns:
            dict: 대차거래상위10종목 데이터
                {
                    "dbrt_trde_cntrcnt_sum": str,  # 대차거래체결주수합
                    "dbrt_trde_rpy_sum": str,  # 대차거래상환주수합
                    "rmnd_sum": str,  # 잔고주수합
                    "remn_amt_sum": str,  # 잔고금액합
                    "dbrt_trde_cntrcnt_rt": str,  # 대차거래체결주수비율
                    "dbrt_trde_rpy_rt": str,  # 대차거래상환주수비율
                    "rmnd_rt": str,  # 잔고주수비율
                    "remn_amt_rt": str,  # 잔고금액비율
                    "dbrt_trde_upper_10stk": list,  # 대차거래상위10종목 리스트
                        [
                            {
                                "stk_nm": str,  # 종목명
                                "stk_cd": str,  # 종목코드
                                "dbrt_trde_cntrcnt": str,  # 대차거래체결주수
                                "dbrt_trde_rpy": str,  # 대차거래상환주수
                                "rmnd": str,  # 잔고주수
                                "remn_amt": str,  # 잔고금액
                            }
                        ],
                    "return_code": int,  # 응답코드
                    "return_msg": str,  # 응답메시지
                }

        Example:
            >>> from kiwoom_rest_api import KiwoomRestAPI
            >>> api = KiwoomRestAPI()
            >>> result = api.slb.top10_stock_lending_request_ka10069(
            ...     strt_dt="20241110",
            ...     end_dt="20241125",
            ...     mrkt_tp="001"
            ... )
            >>> print(result)
        """
        headers = {
            "cont-yn": cont_yn,
            "next-key": next_key,
            "api-id": "ka10069",
        }

        data = {
            "strt_dt": strt_dt,
            "end_dt": end_dt,
            "mrkt_tp": mrkt_tp,
        }

        return self._execute_request(
            "POST",
            json=data,
            headers=headers,
        )
        
    def stockwise_lending_trend_request_ka20068(
        self,
        stk_cd: str,
        strt_dt: str = "",
        end_dt: str = "",
        all_tp: str = "0",
        cont_yn: str = "N",
        next_key: str = "",
    ) -> dict:
        """종목별 대차거래추이를 요청합니다.

        Args:
            stk_cd (str): 종목코드
            strt_dt (str, optional): 시작일자 (YYYYMMDD). Defaults to "".
            end_dt (str, optional): 종료일자 (YYYYMMDD). Defaults to "".
            all_tp (str, optional): 전체구분 (0:종목코드 입력종목만 표시). Defaults to "0".
            cont_yn (str, optional): 연속조회여부. Defaults to "N".
            next_key (str, optional): 연속조회키. Defaults to "".

        Returns:
            dict: 종목별 대차거래추이 데이터
                {
                    "dbrt_trde_trnsn": list,  # 대차거래추이 리스트
                        [
                            {
                                "dt": str,  # 일자
                                "dbrt_trde_cntrcnt": str,  # 대차거래체결주수
                                "dbrt_trde_rpy": str,  # 대차거래상환주수
                                "dbrt_trde_irds": str,  # 대차거래증감
                                "rmnd": str,  # 잔고주수
                                "remn_amt": str,  # 잔고금액
                            }
                        ],
                    "return_code": int,  # 응답코드
                    "return_msg": str,  # 응답메시지
                }

        Example:
            >>> from kiwoom_rest_api import KiwoomRestAPI
            >>> api = KiwoomRestAPI()
            >>> result = api.slb.stockwise_lending_trend_request_ka20068(
            ...     stk_cd="005930",
            ...     strt_dt="20250401",
            ...     end_dt="20250430",
            ...     all_tp="0"
            ... )
            >>> print(result)
        """
        headers = {
            "cont-yn": cont_yn,
            "next-key": next_key,
            "api-id": "ka20068",
        }

        data = {
            "stk_cd": stk_cd,
            "strt_dt": strt_dt,
            "end_dt": end_dt,
            "all_tp": all_tp,
        }

        return self._execute_request(
            "POST",
            json=data,
            headers=headers,
        )
        
    def stock_lending_details_request_ka90012(
        self,
        dt: str,
        mrkt_tp: str,
        cont_yn: str = "N",
        next_key: str = "",
    ) -> dict:
        """대차거래내역을 요청합니다.

        Args:
            dt (str): 일자 (YYYYMMDD 형식)
            mrkt_tp (str): 시장구분 (001:코스피, 101:코스닥)
            cont_yn (str, optional): 연속조회여부. Defaults to "N".
            next_key (str, optional): 연속조회키. Defaults to "".

        Returns:
            dict: 대차거래내역 데이터
                {
                    "dbrt_trde_prps": list,  # 대차거래내역 리스트
                        [
                            {
                                "stk_nm": str,  # 종목명
                                "stk_cd": str,  # 종목코드
                                "dbrt_trde_cntrcnt": str,  # 대차거래체결주수
                                "dbrt_trde_rpy": str,  # 대차거래상환주수
                                "rmnd": str,  # 잔고주수
                                "remn_amt": str,  # 잔고금액
                            }
                        ],
                    "return_code": int,  # 응답코드
                    "return_msg": str,  # 응답메시지
                }

        Example:
            >>> from kiwoom_rest_api import KiwoomRestAPI
            >>> api = KiwoomRestAPI()
            >>> result = api.slb.stock_lending_details_request_ka90012(
            ...     dt="20241101",
            ...     mrkt_tp="101"
            ... )
            >>> print(result)
        """
        headers = {
            "cont-yn": cont_yn,
            "next-key": next_key,
            "api-id": "ka90012",
        }

        data = {
            "dt": dt,
            "mrkt_tp": mrkt_tp,
        }

        return self._execute_request(
            "POST",
            json=data,
            headers=headers,
        )