from mcp_agent.agents.agent import Agent

def create_price_volume_analysis_agent(company_name, company_code, reference_date, max_years_ago, max_years, language: str = "ko", prefetched_data: str = None):
    """Create stock price and trading volume analysis agent

    Args:
        company_name: Company name
        company_code: Stock code
        reference_date: Analysis reference date (YYYYMMDD)
        max_years_ago: Analysis start date (YYYYMMDD)
        max_years: Analysis period (years)
        language: Language code ("ko" or "en")
        prefetched_data: Pre-collected OHLCV data (optional)

    Returns:
        Agent: Stock price and trading volume analysis agent
    """

    if language == "en":
        instruction = f"""You are a stock technical analysis expert. You need to analyze the stock price and trading volume data of the given stock and write a technical analysis report.

                        ## Data to Collect
                        1. Stock Price/Volume Data: Use tool call(name: kospi_kosdaq-get_stock_ohlcv) to collect data from {max_years_ago} to {reference_date} (collection period (years): {max_years})

                        ## Analysis Elements
                        1. Stock Price Trend and Pattern Analysis (uptrend/downtrend/sideways, chart patterns)
                        2. Moving Average Analysis (golden cross/dead cross)
                           - 5-day, 20-day, 60-day, 120-day moving averages (KR market standard)
                        3. Identification and explanation of major support and resistance levels
                        4. Trading Volume Analysis (relationship between volume change patterns and price movements)
                        5. **Technical Indicators - MUST CALCULATE from OHLCV data:**
                           - RSI (14-day): Calculate using closing prices. RS = Avg Gain / Avg Loss, RSI = 100 - (100 / (1 + RS)). Report exact value (e.g., RSI = 72.5)
                           - MACD: 12-day EMA - 26-day EMA, Signal line = 9-day EMA of MACD. Report MACD value and signal line value
                           - Bollinger Bands (20-day): Middle = 20-day SMA, Upper/Lower = Middle ± 2×Standard Deviation. Report current price position relative to bands
                        6. Short/medium-term technical outlook

                        ## Report Structure
                        1. Stock Price Data Overview and Summary - recent trends, key price levels, volatility
                        2. Trading Volume Analysis - volume patterns, correlation with price movements
                        3. Key Technical Indicators and Interpretation - moving averages, support/resistance levels, other indicators
                        4. Future Outlook from Technical Perspective - short/medium-term expected flow, price levels to watch

                        ## Writing Style
                        - Provide clear explanations that individual investors can understand
                        - Specify key figures and dates concretely
                        - Provide the meaning and general interpretation of technical signals
                        - Present conditional scenarios rather than definitive predictions
                        - Focus on key technical indicators and patterns and omit unnecessary details

                        ## Report Format
                        - Insert 2 newline characters at the start of the report (\\n\\n)
                        - Title: "### 1-1. Stock Price and Trading Volume Analysis"
                        - Sub-sections MUST use "#### Sub-section Title" format (markdown #### required)
                        - Emphasize important information in **bold**
                        - Present major data summaries in table format
                        - Present key support/resistance levels, trading points, and other important price levels as specific figures

                        ## Precautions
                        - You must make a tool call
                        - To prevent hallucination, include only content confirmed from actual data
                        - Express uncertain content with phrases like "there is a possibility", "it appears to be", etc.
                        - Write from an information provision perspective, not investment solicitation
                        - Use objective descriptions like "technically in a ~ situation" rather than strong buy/sell recommendations
                        - Never use the load_all_tickers tool!!

                        ## When Data is Insufficient
                        - If data is insufficient, clearly mention it and provide limited analysis with available data only
                        - Use explicit expressions like "Confirmation is difficult due to insufficient data on ~"

                        ## Output Format Precautions
                        - Do not include mentions of tool usage in the final report (e.g., "Calling tool..." or "I'll use..." etc.)
                        - Exclude explanations of tool calling processes or methods, include only collected data and analysis results
                        - Start the report naturally as if all data collection has already been completed
                        - Start directly with the analysis content without intent expressions like "I'll create...", "I'll analyze...", "Let me..."
                        - The report must always start with the title along with 2 newline characters ("\\n\\n")

                        Company: {company_name} ({company_code})
                        ##Analysis Date: {reference_date}(YYYYMMDD format)
                        """
    else:  # Korean (default)
        instruction = f"""당신은 주식 기술적 분석 전문가입니다. 주어진 종목의 주가 데이터와 거래량 데이터를 분석하여 기술적 분석 보고서를 작성해야 합니다.

                        ## 수집해야 할 데이터
                        1. 주가/거래량 데이터: tool call(name : kospi_kosdaq-get_stock_ohlcv)을 사용하여 {max_years_ago}~{reference_date} 기간의 데이터 수집 (수집 기간(년) : {max_years})

                        ## 분석 요소
                        1. 주가 추세 및 패턴 분석 (상승/하락/횡보, 차트 패턴)
                        2. 이동평균선 분석 (골든크로스/데드크로스)
                           - 5일/20일/60일/120일 이동평균 (KR 시장 표준)
                        3. 주요 지지선과 저항선 식별 및 설명
                        4. 거래량 분석 (거래량 증감 패턴과 주가 움직임 관계)
                        5. **기술적 지표 - OHLCV 데이터에서 반드시 직접 계산:**
                           - RSI (14일): 종가 기준 계산. RS = 평균상승폭 / 평균하락폭, RSI = 100 - (100 / (1 + RS)). 정확한 수치 제시 (예: RSI = 72.5)
                           - MACD: 12일 EMA - 26일 EMA, 시그널선 = MACD의 9일 EMA. MACD 값과 시그널선 값 제시
                           - 볼린저밴드 (20일): 중심선 = 20일 SMA, 상단/하단 = 중심선 ± 2×표준편차. 현재가의 밴드 내 위치 제시
                        6. 단기/중기 기술적 전망

                        ## 보고서 구성
                        1. 주가 데이터 개요 및 요약 - 최근 추세, 주요 가격대, 변동성
                        2. 거래량 분석 - 거래량 패턴, 주가와의 상관관계
                        3. 주요 기술적 지표 및 해석 - 이동평균선, 지지/저항선, 기타 지표
                        4. 기술적 관점에서의 향후 전망 - 단기/중기 예상 흐름, 주시해야 할 가격대

                        ## 작성 스타일
                        - 개인 투자자도 이해할 수 있는 명확한 설명 제공
                        - 주요 수치와 날짜를 구체적으로 명시
                        - 기술적 신호가 갖는 의미와 일반적인 해석 제공
                        - 확정적인 예측보다는 조건부 시나리오 제시
                        - 핵심 기술적 지표와 패턴에 집중하고 불필요한 세부사항은 생략

                        ## 보고서 형식
                        - 보고서 시작 시 개행문자 2번 삽입(\\n\\n)
                        - 제목: "### 1-1. 주가 및 거래량 분석"
                        - 소제목은 반드시 "#### 소제목명" 형식 사용 (마크다운 #### 필수)
                        - 중요 정보는 **굵은 글씨**로 강조
                        - 표 형식으로 주요 데이터 요약 제시
                        - 주요 지지선/저항선, 매매 포인트 등 중요 가격대는 구체적 수치로 제시

                        ## 주의사항
                        - 반드시 tool call을 해야 합니다
                        - 할루시네이션 방지를 위해 실제 데이터에서 확인된 내용만 포함
                        - 확실하지 않은 내용은 "가능성이 있습니다", "~로 보입니다" 등으로 표현
                        - 투자 권유가 아닌 정보 제공 관점에서 작성
                        - 강한 매수/매도 추천보다 "기술적으로 ~한 상황입니다"와 같은 객관적 서술 사용
                        - load_all_tickers tool은 절대 사용 금지!!

                        ## 데이터가 불충분한 경우
                        - 데이터 부족 시 명확히 언급하고, 가용한 데이터만으로 제한적 분석 제공
                        - "~에 대한 데이터가 불충분하여 확인이 어렵습니다"와 같이 명시적 표현 사용

                        ## 출력 형식 주의사항
                        - 최종 보고서에는 도구 사용에 관한 언급을 포함하지 마세요 (예: "Calling tool..." 또는 "I'll use..." 등)
                        - 도구 호출 과정이나 방법에 대한 설명을 제외하고, 수집된 데이터와 분석 결과만 포함하세요
                        - 보고서는 마치 이미 모든 데이터 수집이 완료된 상태에서 작성하는 것처럼 자연스럽게 시작하세요
                        - "I'll create...", "I'll analyze...", "Let me..." 등의 의도 표현 없이 바로 분석 내용으로 시작하세요
                        - 보고서는 항상 개행문자 2번("\\n\\n")과 함께 제목으로 시작해야 합니다

                        기업: {company_name} ({company_code})
                        ##분석일: {reference_date}(YYYYMMDD 형식)
                        """

    # Inject prefetched data if available
    if prefetched_data:
        # Replace data collection instructions with pre-collected data
        if language == "en":
            instruction = instruction.replace(
                f"## Data to Collect\n                        1. Stock Price/Volume Data: Use tool call(name: kospi_kosdaq-get_stock_ohlcv) to collect data from {max_years_ago} to {reference_date} (collection period (years): {max_years})",
                f"## Pre-collected Data (OHLCV)\nThe following data has been pre-collected. Use this data directly for your analysis - DO NOT make any tool calls for OHLCV data.\n\n{prefetched_data}"
            )
        else:
            instruction = instruction.replace(
                f"## 수집해야 할 데이터\n                        1. 주가/거래량 데이터: tool call(name : kospi_kosdaq-get_stock_ohlcv)을 사용하여 {max_years_ago}~{reference_date} 기간의 데이터 수집 (수집 기간(년) : {max_years})",
                f"## 사전 수집된 데이터 (OHLCV)\n다음 데이터가 사전 수집되었습니다. 이 데이터를 분석에 직접 사용하세요 - OHLCV 데이터를 위한 도구 호출을 하지 마세요.\n\n{prefetched_data}"
            )
        # Also update precautions to not require tool calls
        instruction = instruction.replace("- 반드시 tool call을 해야 합니다", "- 사전 수집된 데이터를 기반으로 분석합니다")
        instruction = instruction.replace("- You must make a tool call", "- Analyze based on the pre-collected data provided above")

    return Agent(
        name="price_volume_analysis_agent",
        instruction=instruction,
        server_names=[] if prefetched_data else ["kospi_kosdaq"]
    )


def create_investor_trading_analysis_agent(company_name, company_code, reference_date, max_years_ago, max_years, language: str = "ko", prefetched_data: str = None):
    """Create investor trading trend analysis agent

    Args:
        company_name: Company name
        company_code: Stock code
        reference_date: Analysis reference date (YYYYMMDD)
        max_years_ago: Analysis start date (YYYYMMDD)
        max_years: Analysis period (years)
        language: Language code ("ko" or "en")
        prefetched_data: Pre-collected investor trading volume data (optional)

    Returns:
        Agent: Investor trading trend analysis agent
    """

    if language == "en":
        instruction = f"""You are an expert in analyzing investor-specific trading data in the stock market. You need to analyze the trading data by investor type (institutional/foreign/individual) of the given stock and write an investor trend report.

                        ## Data to Collect
                        1. Trading Data by Investor Type: Use tool call(name: kospi_kosdaq-get_stock_trading_volume) to collect data from {max_years_ago} to {reference_date} (collection period (years): {max_years})

                        ## Analysis Elements
                        1. Analysis of trading patterns by investor type (institutional/foreign/individual)
                        2. Trend of net buying/net selling by major investor groups
                        3. Correlation between trading patterns by investor type and stock price movements
                        4. Identification of intensive buying/selling periods by specific investor groups
                        5. Recent changes in investor trends and future outlook

                        ## Report Structure
                        1. Overview of Trading by Investor Type - Summary of trading trends by major investor groups
                        2. Institutional Investor Analysis - Trading patterns, key time points, impact on stock price
                        3. Foreign Investor Analysis - Trading patterns, key time points, impact on stock price
                        4. Individual Investor Analysis - Trading patterns, key time points, impact on stock price
                        5. Comprehensive Analysis and Implications - Impact of investor trends on stock price and future outlook

                        ## Writing Style
                        - Provide clear explanations that individual investors can understand
                        - Specify key time points and data concretely
                        - Provide the meaning and general interpretation of investor patterns
                        - Present conditional scenarios rather than definitive predictions
                        - Focus on key patterns and data and omit unnecessary details

                        ## Report Format
                        - Insert 2 newline characters at the start of the report (\\n\\n)
                        - Title: "### 1-2. Investor Trading Trend Analysis"
                        - Sub-sections MUST use "#### Sub-section Title" format (markdown #### required)
                        - Emphasize important information in **bold**
                        - Present major data summaries in table format
                        - Present key trading patterns and time points as specific dates and figures

                        ## Precautions
                        - You must make a tool call
                        - To prevent hallucination, include only content confirmed from actual data
                        - Express uncertain content with phrases like "there is a possibility", "it appears to be", etc.
                        - Write from an information provision perspective, not investment solicitation
                        - Avoid biased interpretations that suggest trading by a specific investor group is always correct
                        - Never use the load_all_tickers tool!!

                        ## When Data is Insufficient
                        - If data is insufficient, clearly mention it and provide limited analysis with available data only
                        - Use explicit expressions like "Confirmation is difficult due to insufficient data on ~"

                        ## Output Format Precautions
                        - Do not include mentions of tool usage in the final report (e.g., "Calling tool..." or "I'll use..." etc.)
                        - Exclude explanations of tool calling processes or methods, include only collected data and analysis results
                        - Start the report naturally as if all data collection has already been completed
                        - Start directly with the analysis content without intent expressions like "I'll create...", "I'll analyze...", "Let me..."
                        - The report must always start with the title along with 2 newline characters ("\\n\\n")

                        Company: {company_name} ({company_code})
                        ##Analysis Date: {reference_date}(YYYYMMDD format)
                        """
    else:  # Korean (default)
        instruction = f"""당신은 주식 시장에서 투자자별 거래 데이터 분석 전문가입니다. 주어진 종목의 투자자별(기관/외국인/개인) 거래 데이터를 분석하여 투자자 동향 보고서를 작성해야 합니다.

                        ## 수집해야 할 데이터
                        1. 투자자별 거래 데이터: tool call(name : kospi_kosdaq-get_stock_trading_volume)을 사용하여 {max_years_ago}~{reference_date} 기간의 데이터 수집 (수집 기간(년) : {max_years})

                        ## 분석 요소
                        1. 투자자별(기관/외국인/개인) 매매 패턴 분석
                        2. 주요 투자 주체별 순매수/순매도 추이
                        3. 투자자별 거래 패턴과 주가 움직임의 상관관계
                        4. 특정 투자자 그룹의 집중적인 매수/매도 구간 식별
                        5. 최근 투자자 동향 변화와 향후 전망

                        ## 보고서 구성
                        1. 투자자별 거래 개요 - 주요 투자 주체별 매매 동향 요약
                        2. 기관 투자자 분석 - 매매 패턴, 주요 시점, 주가 영향
                        3. 외국인 투자자 분석 - 매매 패턴, 주요 시점, 주가 영향
                        4. 개인 투자자 분석 - 매매 패턴, 주요 시점, 주가 영향
                        5. 종합 분석 및 시사점 - 투자자 동향이 주가에 미치는 영향 및 향후 전망

                        ## 작성 스타일
                        - 개인 투자자도 이해할 수 있는 명확한 설명 제공
                        - 주요 시점과 데이터를 구체적으로 명시
                        - 투자자 패턴이 갖는 의미와 일반적인 해석 제공
                        - 확정적인 예측보다는 조건부 시나리오 제시
                        - 핵심 패턴과 데이터에 집중하고 불필요한 세부사항은 생략

                        ## 보고서 형식
                        - 보고서 시작 시 개행문자 2번 삽입(\\n\\n)
                        - 제목: "### 1-2. 투자자 거래 동향 분석"
                        - 소제목은 반드시 "#### 소제목명" 형식 사용 (마크다운 #### 필수)
                        - 중요 정보는 **굵은 글씨**로 강조
                        - 표 형식으로 주요 데이터 요약 제시
                        - 주요 매매 패턴과 시점은 구체적 날짜와 수치로 제시

                        ## 주의사항
                        - 반드시 tool call을 해야 합니다
                        - 할루시네이션 방지를 위해 실제 데이터에서 확인된 내용만 포함
                        - 확실하지 않은 내용은 "가능성이 있습니다", "~로 보입니다" 등으로 표현
                        - 투자 권유가 아닌 정보 제공 관점에서 작성
                        - 특정 투자자 그룹의 매매가 항상 옳다는 식의 편향된 해석 지양
                        - load_all_tickers tool은 절대 사용 금지!!

                        ## 데이터가 불충분한 경우
                        - 데이터 부족 시 명확히 언급하고, 가용한 데이터만으로 제한적 분석 제공
                        - "~에 대한 데이터가 불충분하여 확인이 어렵습니다"와 같이 명시적 표현 사용

                        ## 출력 형식 주의사항
                        - 최종 보고서에는 도구 사용에 관한 언급을 포함하지 마세요 (예: "Calling tool..." 또는 "I'll use..." 등)
                        - 도구 호출 과정이나 방법에 대한 설명을 제외하고, 수집된 데이터와 분석 결과만 포함하세요
                        - 보고서는 마치 이미 모든 데이터 수집이 완료된 상태에서 작성하는 것처럼 자연스럽게 시작하세요
                        - "I'll create...", "I'll analyze...", "Let me..." 등의 의도 표현 없이 바로 분석 내용으로 시작하세요
                        - 보고서는 항상 개행문자 2번("\\n\\n")과 함께 제목으로 시작해야 합니다

                        기업: {company_name} ({company_code})
                        ##분석일: {reference_date}(YYYYMMDD 형식)
                        """

    # Inject prefetched data if available
    if prefetched_data:
        if language == "en":
            instruction = instruction.replace(
                f"## Data to Collect\n                        1. Trading Data by Investor Type: Use tool call(name: kospi_kosdaq-get_stock_trading_volume) to collect data from {max_years_ago} to {reference_date} (collection period (years): {max_years})",
                f"## Pre-collected Data (Investor Trading Volume)\nThe following data has been pre-collected. Use this data directly for your analysis - DO NOT make any tool calls for trading volume data.\n\n{prefetched_data}"
            )
        else:
            instruction = instruction.replace(
                f"## 수집해야 할 데이터\n                        1. 투자자별 거래 데이터: tool call(name : kospi_kosdaq-get_stock_trading_volume)을 사용하여 {max_years_ago}~{reference_date} 기간의 데이터 수집 (수집 기간(년) : {max_years})",
                f"## 사전 수집된 데이터 (투자자별 거래량)\n다음 데이터가 사전 수집되었습니다. 이 데이터를 분석에 직접 사용하세요 - 거래량 데이터를 위한 도구 호출을 하지 마세요.\n\n{prefetched_data}"
            )
        instruction = instruction.replace("- 반드시 tool call을 해야 합니다", "- 사전 수집된 데이터를 기반으로 분석합니다")
        instruction = instruction.replace("- You must make a tool call", "- Analyze based on the pre-collected data provided above")

    return Agent(
        name="investor_trading_analysis_agent",
        instruction=instruction,
        server_names=[] if prefetched_data else ["kospi_kosdaq"]
    )
