File size: 4,260 Bytes
f3ed66a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# utils.py
import json
from datetime import datetime
import streamlit as st
import plotly.graph_objects as go
import plotly.express as px
import re
import pdfkit
from jinja2 import Template

class ReportManager:
    def __init__(self):
        if 'reports' not in st.session_state:
            st.session_state.reports = {}

    def save_report(self, topic: str, report_data: dict):
        """Save a new report with timestamp"""
        timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        report_id = f"{topic}_{timestamp}"
        
        st.session_state.reports[report_id] = {
            'topic': topic,
            'timestamp': timestamp,
            'exec_summary': report_data.get('exec_summary', ''),
            'detailed_report': report_data.get('detailed_report', ''),
            'sources': report_data.get('sources', []),
            'charts': report_data.get('charts', [])
        }
        return report_id

    def get_report(self, report_id: str):
        """Retrieve a specific report"""
        return st.session_state.reports.get(report_id)

    def get_all_reports(self):
        """Get all saved reports"""
        return st.session_state.reports

    def generate_visualizations(self, report_text: str):
        """Generate relevant visualizations based on report content"""
        charts = []
        
        # Extract numerical data using regex patterns
        market_size_pattern = r"\$\s*(\d+(?:\.\d+)?)\s*(?:billion|million|trillion)"
        growth_rate_pattern = r"(\d+(?:\.\d+)?)\s*%"
        
        # Market size data
        market_sizes = re.findall(market_size_pattern, report_text)
        if market_sizes:
            fig = go.Figure(data=[
                go.Bar(
                    x=['Current Market Size', 'Projected Size'],
                    y=[float(market_sizes[0]), float(market_sizes[-1])],
                    text=[f'${x}B' for x in market_sizes],
                    textposition='auto',
                )
            ])
            fig.update_layout(title='Market Size Projection')
            charts.append(fig)

        # Growth rate data
        growth_rates = re.findall(growth_rate_pattern, report_text)
        if growth_rates:
            fig = go.Figure(data=[
                go.Line(
                    x=list(range(len(growth_rates))),
                    y=[float(x) for x in growth_rates],
                    mode='lines+markers'
                )
            ])
            fig.update_layout(title='Growth Rate Trends')
            charts.append(fig)

        return charts

    def generate_pdf(self, report_id: str):
        """Generate PDF version of the report"""
        report = self.get_report(report_id)
        if not report:
            return None

        # HTML template for PDF
        template_str = """
        <!DOCTYPE html>
        <html>
        <head>
            <style>
                body { font-family: Arial, sans-serif; }
                .header { text-align: center; margin-bottom: 30px; }
                .section { margin: 20px 0; }
                .charts { text-align: center; }
            </style>
        </head>
        <body>
            <div class="header">
                <h1>{{ report.topic }} - Market Research Report</h1>
                <p>Generated on: {{ report.timestamp }}</p>
            </div>
            
            <div class="section">
                <h2>Executive Summary</h2>
                {{ report.exec_summary }}
            </div>

            <div class="section">
                <h2>Detailed Analysis</h2>
                {{ report.detailed_report }}
            </div>

            <div class="section">
                <h2>Sources</h2>
                <ul>
                {% for source in report.sources %}
                    <li>{{ source }}</li>
                {% endfor %}
                </ul>
            </div>
        </body>
        </html>
        """

        # Render template
        template = Template(template_str)
        html = template.render(report=report)

        # Convert to PDF
        try:
            pdf = pdfkit.from_string(html, False)
            return pdf
        except Exception as e:
            st.error(f"Error generating PDF: {str(e)}")
            return None