# 1. 조회
# invest_id=228 인 투자자가 투자한 포트폴리오를 모두 조회한다
# PK=228, SK=portfolio#
import boto3
import json
import decimal
from elasticsearch import Elasticsearch
import json
from collections import defaultdict

# elastic 연결
cloud_id = 'univ=============================='
username = 'e==========='
password = 'wNl==========='

dynamodb = boto3.resource('dynamodb', region_name='ap-northeast-2')
table = dynamodb.Table('LUCK4_INNOFOREST_DB')

total = 0

investments = defaultdict(list)
investments_price = defaultdict(list)
investment_amounts = {}
investment_dates = []

for x in range(0,338): # invest_id를 차례로 조회한다

    ############ (1) SORT KEY - INSIGHT 에서 데이터 가져오기     ############ 
    
    partition_key_value = str(x)
    sort_key_prefix = 'insight'
    
    # 쿼리 실행
    insight_response = table.query(
        KeyConditionExpression="#pk = :pkval AND begins_with(#sk, :skval)",
        ExpressionAttributeNames={
            "#pk": "invest_id",
            "#sk": "sort_key"
        },
        ExpressionAttributeValues={
            ":pkval": partition_key_value,
            ":skval": sort_key_prefix
        }
    )
    
    insight_items = insight_response.get('Items', [])
    
    
    for item in insight_items:
            
        ### 데이터 전처리 : 투자 금액, 날짜 전처리 + 가중치 계산 ###
        if '총 투자 횟수' in item:
            threeyear_num = item['창업 3년미만기업'] if item['창업 3년미만기업'] != '' else 0
            startup_num = item['스타트업이 첫  투자'] if item['스타트업이 첫  투자'] != '' else 0

            investor_name = item['투자사 이름']

            
            mbti4 = int(threeyear_num) + int(startup_num)
            print(mbti4)

    ############ (2) Sort Key: MBTI 에서 이미 올린 MBTI_1 과 MBTI_3 정보도 가져온다    ############ 
    # mbti는 별도로 sort key 설정
    # ** x번째 투자사의 mbti를 조회한다
    # 쿼리 조건 설정
    partition_key_value = investor_name
    sort_key_prefix = 'mbti#'+str(x)
    # 쿼리 실행
    mbti_response = table.query(
        KeyConditionExpression="#pk = :pkval AND begins_with(#sk, :skval)",
        ExpressionAttributeNames={
            "#pk": "invest_id",
            "#sk": "sort_key"
        },
        ExpressionAttributeValues={
            ":pkval": partition_key_value,
            ":skval": sort_key_prefix
        }
    )
    
    # 가져온 데이터 확인
    mbti_items = mbti_response.get('Items', [])
    
    
    for item in mbti_items:
            
        ### 투자 금액, 날짜 전처리 + 가중치 계산 ###
        if 'MBTI_1' in item:
            
            mbti1 = item['MBTI_1']
            mbti3 = item['MBTI_3']
            
            
           
    ############ (3)  Sort Key: PORTFOLIO 에서    ############  
    # 쿼리 조건 설정
    partition_key_value = str(x)
    sort_key_prefix = 'portfolio#'
    # 쿼리 실행
    response = table.query(
        
        KeyConditionExpression="#pk = :pkval AND begins_with(#sk, :skval)",
        
        ExpressionAttributeNames={
            "#pk": "invest_id",
            "#sk": "sort_key"
        },
        ExpressionAttributeValues={
            ":pkval": partition_key_value,
            ":skval": sort_key_prefix
        }
    )

    # 가져온 데이터 확인
    items = response.get('Items', [])
    
    for item in items:
            
        ### 투자 금액, 날짜 전처리 + 가중치 계산 ###
        if '투자일' in item:
            
            invest_date = item['투자일'].replace("[", "").replace("]", "").replace("'", "").replace("-","").replace(",", "")
            investment_amount = item['투자 금액'].replace("[", "").replace("]", "").replace("'", "").replace(",", "").replace("만", "").replace("억", '0000').replace('비공개', '0')
            invest_id = item['invest_id']
            
            
            #### 가중치 계산 ####
            dates = []
            amounts = []
                
            for i in invest_date.split():
                
                dates.append(i)
                
            for j in investment_amount.split():
                if "." in j:
                    j = j.replace(".","")
                    j = j[:-1]
                
                amounts.append(j)
            
            for k in range(len(dates)):
                year = int(dates[k][2:4])
                month = int(dates[k][4:])
                weight_price = int(amounts[k])*year*month
                
                investments_price[invest_id].append(weight_price)
                
            
             
            for add in investments_price[invest_id]:
                total += add
                investments[invest_id] = total
                
    

    
    
    
        ############## DyanamoDB에 저장 
        
        # dynamodb = boto3.resource('dynamodb')
        # table = dynamodb.Table('LUCK4_INNOFOREST_DB')
                        
        new_item = {
            'invest_id': investor_name,  # 기본 키 값
            'sort_key': "mbti#"+ str(x),
            '투자사 이름': investor_name,
            'MBTI_1':mbti1,
            'MBTI_2': investments[invest_id],
            'MBTI_3':mbti3,
            'MBTI_4': mbti4
    
        }
            
                        
#     response_end = table.put_item(Item=new_item)

                
# if response_end['ResponseMetadata']['HTTPStatusCode'] == 200:
#     print("새로운 항목이 성공적으로 생성되었습니다.")
# else:
#     print("항목 생성에 실패했습니다.")
    
    
    

        es = Elasticsearch(
            cloud_id=cloud_id,
            basic_auth=(username, password),
        )
        es.index(index='investor_mbti_luck4', id=str(x), document=new_item)
        break