"""
WFIS PDF Report Generator - Full Version with 3 Report Types
"""

import os
from datetime import datetime
from io import BytesIO
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import inch


class PDFReportGenerator:
    def __init__(self):
        self.output_dir = "reports"
        os.makedirs(self.output_dir, exist_ok=True)
    
    def generate_report(self, symbol, market_data, report_type="quick"):
        """Generate PDF report based on type: quick, full, or technical"""
        buffer = BytesIO()
        doc = SimpleDocTemplate(buffer, pagesize=A4, rightMargin=72, leftMargin=72, topMargin=72, bottomMargin=72)
        styles = getSampleStyleSheet()
        
        # Custom styles
        title_style = ParagraphStyle('CustomTitle', parent=styles['Heading1'], fontSize=20, textColor=colors.HexColor('#00d4ff'), spaceAfter=30)
        heading_style = ParagraphStyle('CustomHeading', parent=styles['Heading2'], fontSize=14, textColor=colors.HexColor('#00d4ff'), spaceAfter=12)
        
        story = []
        
        # Title
        type_names = {'quick': 'Quick Report', 'full': 'Full Analysis Report', 'technical': 'Technical Analysis Report'}
        story.append(Paragraph(f"WFIS {type_names.get(report_type, 'Report')} - {symbol}", title_style))
        story.append(Paragraph(f"Generated: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}", styles['Normal']))
        story.append(Spacer(1, 20))
        
        snap = market_data.get('snapshot', {})
        
        if report_type == "quick":
            # گزارش سریع - فقط خلاصه
            story.append(Paragraph("Market Snapshot", heading_style))
            story.append(Paragraph(f"💰 Current Price: ${snap.get('price', 0):,.2f}", styles['Normal']))
            story.append(Paragraph(f"📊 24h Change: {snap.get('change_24h', 0):.2f}%", styles['Normal']))
            story.append(Paragraph(f"📈 24h Volume: {snap.get('volume', 0):,.0f}", styles['Normal']))
            story.append(Spacer(1, 15))
            
            vol = market_data.get('volatility_analysis', {})
            story.append(Paragraph("Volatility Outlook", heading_style))
            story.append(Paragraph(f"⚡ {vol.get('outlook', 'Normal')}", styles['Normal']))
            story.append(Spacer(1, 15))
            
            scen = market_data.get('scenario_analysis', {}).get('scenarios', {})
            story.append(Paragraph("Dominant Scenario", heading_style))
            if scen.get('neutral', 0) > 40:
                story.append(Paragraph("⚪ Neutral - Wait for breakout", styles['Normal']))
            elif scen.get('bullish', 0) > scen.get('bearish', 0):
                story.append(Paragraph("🟢 Bullish - Positive momentum", styles['Normal']))
            else:
                story.append(Paragraph("🔴 Bearish - Negative pressure", styles['Normal']))
        
        elif report_type == "full":
            # گزارش کامل
            story.append(Paragraph("1. Market Snapshot", heading_style))
            story.append(Paragraph(f"Current Price: ${snap.get('price', 0):,.2f}", styles['Normal']))
            story.append(Paragraph(f"24h Change: {snap.get('change_24h', 0):.2f}%", styles['Normal']))
            story.append(Paragraph(f"24h High: ${snap.get('high_24h', 0):,.2f}", styles['Normal']))
            story.append(Paragraph(f"24h Low: ${snap.get('low_24h', 0):,.2f}", styles['Normal']))
            story.append(Spacer(1, 15))
            
            story.append(Paragraph("2. Liquidity Analysis", heading_style))
            liq = market_data.get('liquidity_analysis', {})
            story.append(Paragraph(f"Order Flow Anomaly: {liq.get('order_flow_anomaly', 'NORMAL')}", styles['Normal']))
            for zone in liq.get('liquidity_zones', [])[:3]:
                story.append(Paragraph(f"📍 Liquidity Zone: ${zone.get('level', 0):,.0f} (strength: {zone.get('strength', 0)*100:.0f}%)", styles['Normal']))
            story.append(Spacer(1, 15))
            
            story.append(Paragraph("3. Volatility Analysis", heading_style))
            vol = market_data.get('volatility_analysis', {})
            story.append(Paragraph(f"Current Volatility: {vol.get('current_volatility', 0):.1f}%", styles['Normal']))
            story.append(Paragraph(f"Historical Volatility: {vol.get('historical_volatility', 0):.1f}%", styles['Normal']))
            story.append(Paragraph(f"Outlook: {vol.get('outlook', 'Normal')}", styles['Normal']))
            story.append(Spacer(1, 15))
            
            story.append(Paragraph("4. Monte Carlo Scenarios", heading_style))
            scen = market_data.get('scenario_analysis', {}).get('scenarios', {})
            story.append(Paragraph(f"Bullish: {scen.get('bullish', 0):.1f}%", styles['Normal']))
            story.append(Paragraph(f"Bearish: {scen.get('bearish', 0):.1f}%", styles['Normal']))
            story.append(Paragraph(f"Neutral: {scen.get('neutral', 0):.1f}%", styles['Normal']))
            story.append(Spacer(1, 15))
            
            targets = market_data.get('scenario_analysis', {}).get('price_targets', {})
            story.append(Paragraph("5. Price Targets", heading_style))
            story.append(Paragraph(f"Bullish Target: ${targets.get('bullish', 0):,.0f}", styles['Normal']))
            story.append(Paragraph(f"Bearish Target: ${targets.get('bearish', 0):,.0f}", styles['Normal']))
            story.append(Paragraph(f"Most Likely: ${targets.get('most_likely', 0):,.0f}", styles['Normal']))
            
            # Risk metrics
            risk = market_data.get('scenario_analysis', {}).get('risk_metrics', {})
            story.append(Spacer(1, 15))
            story.append(Paragraph("6. Risk Metrics", heading_style))
            story.append(Paragraph(f"VaR (95%): {risk.get('VaR_95', 0):.2f}%", styles['Normal']))
            story.append(Paragraph(f"CVaR (95%): {risk.get('CVaR_95', 0):.2f}%", styles['Normal']))
            story.append(Paragraph(f"Expected Return: {risk.get('expected_return', 0):.2f}%", styles['Normal']))
        
        elif report_type == "technical":
            # گزارش تکنیکال
            story.append(Paragraph("Technical Analysis Summary", heading_style))
            story.append(Paragraph(f"Current Price: ${snap.get('price', 0):,.2f}", styles['Normal']))
            story.append(Spacer(1, 15))
            
            vol = market_data.get('volatility_analysis', {})
            story.append(Paragraph("Volatility Status", heading_style))
            story.append(Paragraph(f"⚡ {vol.get('outlook', 'Normal')}", styles['Normal']))
            story.append(Spacer(1, 15))
            
            liq = market_data.get('liquidity_analysis', {})
            story.append(Paragraph("Key Liquidity Zones", heading_style))
            for i, zone in enumerate(liq.get('liquidity_zones', [])[:3]):
                story.append(Paragraph(f"  Zone {i+1}: ${zone.get('level', 0):,.0f}", styles['Normal']))
            story.append(Spacer(1, 15))
            
            # Technical indicators
            tech = market_data.get('technical_indicators', {})
            story.append(Paragraph("Technical Indicators", heading_style))
            story.append(Paragraph(f"RSI (14): {tech.get('rsi', 50):.1f}", styles['Normal']))
            story.append(Paragraph(f"MACD: {tech.get('macd', 0):.2f}", styles['Normal']))
            story.append(Paragraph(f"MACD Signal: {tech.get('macd_signal', 0):.2f}", styles['Normal']))
            story.append(Spacer(1, 15))
            
            story.append(Paragraph("Moving Averages", heading_style))
            story.append(Paragraph(f"MA 20: ${tech.get('ma_20', 0):,.0f}", styles['Normal']))
            story.append(Paragraph(f"MA 50: ${tech.get('ma_50', 0):,.0f}", styles['Normal']))
            story.append(Paragraph(f"MA 200: ${tech.get('ma_200', 0):,.0f}", styles['Normal']))
            story.append(Spacer(1, 15))
            
            story.append(Paragraph("Trading Recommendation", heading_style))
            scen = market_data.get('scenario_analysis', {}).get('scenarios', {})
            if scen.get('neutral', 0) > 40:
                story.append(Paragraph("Action: HOLD - Wait for clear breakout", styles['Normal']))
                story.append(Paragraph("Range: Wait for price to exit consolidation", styles['Normal']))
            elif scen.get('bullish', 0) > scen.get('bearish', 0):
                story.append(Paragraph("Action: BUY on dip", styles['Normal']))
                story.append(Paragraph(f"Entry: Near ${snap.get('price', 0) * 0.98:,.0f}", styles['Normal']))
                story.append(Paragraph(f"Target: ${snap.get('price', 0) * 1.05:,.0f}", styles['Normal']))
            else:
                story.append(Paragraph("Action: SELL on rally", styles['Normal']))
                story.append(Paragraph(f"Entry: Near ${snap.get('price', 0) * 1.02:,.0f}", styles['Normal']))
                story.append(Paragraph(f"Target: ${snap.get('price', 0) * 0.95:,.0f}", styles['Normal']))
        
        # Disclaimer
        story.append(Spacer(1, 30))
        disclaimer_style = ParagraphStyle('Disclaimer', parent=styles['Normal'], fontSize=8, textColor=colors.grey)
        story.append(Paragraph("⚠️ Disclaimer: This report is for research purposes only. Not financial advice. Past performance does not guarantee future results.", disclaimer_style))
        
        doc.build(story)
        buffer.seek(0)
        return buffer