File size: 8,286 Bytes
32f16c2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
import streamlit as st
import logging
import traceback
from datetime import datetime, timedelta
import pytz
import random
from data.announcements import get_all_announcements, add_announcement, get_session_announcements, delete_announcement, format_time_ago
from data.db_utils import (
    save_analysis_result as db_save_analysis_result,
    get_analysis_results,
    save_favorite_stock,
    remove_favorite_stock,
    is_favorite_stock,
    get_favorite_stocks,
    save_ml_prediction,
    get_ml_predictions,
    update_ml_prediction_result,
    get_ml_prediction_stats,
    save_announcement,
    get_announcements,
    delete_announcement as db_delete_announcement,
    save_user_note,
    get_user_notes,
    create_database,
    save_ml_model,
    load_ml_model,
    get_model_update_status
)

# Loglama yapılandırması
logger = logging.getLogger(__name__)

# Veritabanını başlangıçta oluştur
try:
    create_database()
except Exception as e:
    logger.error(f"Veritabanı oluşturulurken hata: {str(e)}")

def save_analysis_result(stock_symbol, analysis_data, analysis_type=None, price=None, indicators=None, notes=None):
    """
    Belirli bir hisse senedi için yapılan analiz sonucunu depolar.
    
    Args:
        stock_symbol (str): Hisse senedi sembolü
        analysis_data (dict): Analiz sonuç verisi
        analysis_type (str, optional): Analiz tipi, belirtilmezse veri içinden alınır
        price (float, optional): Hisse fiyatı, belirtilmezse veri içinden alınır
        indicators (dict, optional): Teknik göstergeler
        notes (str, optional): Notlar
    """
    try:
        # Tarihi ekle
        now = datetime.now()
        analysis_data["analysis_time"] = now.strftime("%d.%m.%Y %H:%M")
        
        # Backward compatibility - session state'e de kaydet
        if 'stock_analysis_results' not in st.session_state:
            st.session_state.stock_analysis_results = {}
        
        # Session state'e kaydet
        st.session_state.stock_analysis_results[stock_symbol] = analysis_data
        
        # Analiz geçmişine ekle (eğer yoksa)
        if 'analysis_history' not in st.session_state:
            st.session_state.analysis_history = []
        
        # Zaten varsa önce kaldır (hisse senedi sembolü aynı olduğunda)
        if stock_symbol in st.session_state.analysis_history:
            st.session_state.analysis_history.remove(stock_symbol)
        
        # Listeye en başa ekle
        st.session_state.analysis_history.insert(0, stock_symbol)
        
        # Maksimum 20 kayıt tut
        if len(st.session_state.analysis_history) > 20:
            st.session_state.analysis_history = st.session_state.analysis_history[:20]
        
        # Veritabanına kaydet - parametreleri kontrol et
        if analysis_type is None:
            analysis_type = analysis_data.get("analysis_type", "teknik")
            
        if price is None:
            # Önce last_price'ı kontrol et (ML için)
            price = analysis_data.get("last_price", None)
            
            # Eğer yoksa current_price'ı dene
            if price is None:
                price = analysis_data.get("current_price", 0)
        
        if indicators is None:
            indicators = analysis_data.get("indicators", {})
            
        if notes is None:
            notes = analysis_data.get("notes", "")
        
        # Veritabanına kaydet (kalıcı depolama)
        db_result = db_save_analysis_result(
            stock_symbol, 
            analysis_type, 
            price, 
            analysis_data, 
            indicators, 
            notes
        )
        
        logger.info(f"{stock_symbol} için analiz sonucu başarıyla kaydedildi")
        return db_result
    except Exception as e:
        logger.error(f"Analiz sonucu kaydedilirken hata: {str(e)}")
        logger.error(traceback.format_exc())
        return False

def get_analysis_result(stock_symbol):
    """
    Belirli bir hisse senedi için kaydedilmiş analiz sonucunu getirir.
    
    Args:
        stock_symbol (str): Hisse senedi sembolü
        
    Returns:
        dict: Analiz sonuç verisi, yoksa None
    """
    try:
        # Önce veritabanından getir
        results = get_analysis_results(stock_symbol, limit=1)
        if results and len(results) > 0:
            return results[0]
        
        # Eğer veritabanında yoksa session state'ten kontrol et (eski veriler için)
        if 'stock_analysis_results' not in st.session_state:
            return None
        
        return st.session_state.stock_analysis_results.get(stock_symbol)
    except Exception as e:
        logger.error(f"Analiz sonucu alınırken hata: {str(e)}")
        logger.error(traceback.format_exc())
        return None

def load_analysis_results(analysis_type=None):
    """
    Kaydedilmiş tüm analiz sonuçlarını getirir.
    
    Args:
        analysis_type (str, optional): Analiz tipi (örn: "teknik", "ml")
        
    Returns:
        list: Analiz sonuçlarının listesi
    """
    try:
        # Doğrudan veritabanından getir
        return get_analysis_results(analysis_type=analysis_type)
    except Exception as e:
        logger.error(f"Analiz sonuçları yüklenirken hata: {str(e)}")
        logger.error(traceback.format_exc())
        return []

def add_to_favorites(stock_symbol):
    """
    Bir hisse senedini favorilere ekler.
    
    Args:
        stock_symbol (str): Eklenecek hisse senedi sembolü
    
    Returns:
        bool: İşlem başarılıysa True, aksi halde False
    """
    try:
        # Sembolü düzenle
        stock_symbol = stock_symbol.upper().strip()
        
        # Backward compatibility - session state'e de kaydet
        if 'favorite_stocks' not in st.session_state:
            st.session_state.favorite_stocks = []
            
        if stock_symbol not in st.session_state.favorite_stocks:
            st.session_state.favorite_stocks.append(stock_symbol)
        
        # Veritabanına kaydet
        result = save_favorite_stock(stock_symbol)
        
        logger.info(f"{stock_symbol} favorilere eklendi")
        return result
    except Exception as e:
        logger.error(f"Favori eklenirken hata: {str(e)}")
        logger.error(traceback.format_exc())
        return False

def remove_from_favorites(stock_symbol):
    """
    Bir hisseyi favorilerden çıkarır.
    
    Args:
        stock_symbol (str): Çıkarılacak hisse sembolü
    """
    try:
        # Backward compatibility - session state'ten de çıkar
        if 'favorite_stocks' in st.session_state and stock_symbol in st.session_state.favorite_stocks:
            st.session_state.favorite_stocks.remove(stock_symbol)
        
        # Veritabanından çıkar
        result = remove_favorite_stock(stock_symbol)
        
        logger.info(f"{stock_symbol} favorilerden çıkarıldı")
        return result
    except Exception as e:
        logger.error(f"Favori çıkarılırken hata: {str(e)}")
        return False

def is_favorite(stock_symbol):
    """
    Bir hisse senedinin favorilerde olup olmadığını kontrol eder.
    
    Args:
        stock_symbol (str): Hisse senedi sembolü
        
    Returns:
        bool: Favorilerde ise True, değilse False
    """
    return is_favorite_stock(stock_symbol.upper().strip())

def get_favorites():
    """
    Tüm favori hisse senetlerini getirir.
    
    Returns:
        list: Favori hisse senetlerinin listesi
    """
    try:
        # Önce veritabanından getir
        favorites = get_favorite_stocks()
        
        # Backward compatibility - session state'i de güncelle
        if 'favorite_stocks' not in st.session_state:
            st.session_state.favorite_stocks = []
        
        # Session state'teki favorilerle senkronize et
        for favorite in favorites:
            if favorite not in st.session_state.favorite_stocks:
                st.session_state.favorite_stocks.append(favorite)
        
        return favorites
    except Exception as e:
        logger.error(f"Favoriler getirilirken hata: {str(e)}")
        logger.error(traceback.format_exc())
        # Hata durumunda session state'ten döndür
        return st.session_state.get('favorite_stocks', [])