import os from functools import lru_cache from typing import Optional DESIGN_SYSTEM = { 'colors': { 'primary': '#1E40AF', 'secondary': '#059669', 'accent': '#DC2626', 'warning': '#D97706', 'success': '#10B981', 'background': '#F8FAFC', 'text': '#1F2937', 'border': '#E5E7EB' }, 'fonts': { 'title': 'font-family: "Inter", sans-serif; font-weight: 700;', 'subtitle': 'font-family: "Inter", sans-serif; font-weight: 600;', 'body': 'font-family: "Inter", sans-serif; font-weight: 400;' } } DATA_URLS = { "2024": "https://huggingface.co/spaces/entropy25/production-data-analysis/resolve/main/2024.csv", "2025": "https://huggingface.co/spaces/entropy25/production-data-analysis/resolve/main/2025.csv" } SAMPLE_MATERIALS = ['steel', 'aluminum', 'plastic', 'copper'] SAMPLE_SHIFTS = ['day', 'night'] SAMPLE_BASE_WEIGHTS = { 'steel': 1500, 'aluminum': 800, 'plastic': 600, 'copper': 400 } TRANSLATIONS = { 'English': { 'page_title': 'Production Monitor with AI Insights', 'page_subtitle': 'Nilsen Service & Consulting AS | Real-time Production Analytics & Recommendations', 'sidebar_data_source': 'Data Source', 'sidebar_upload': 'Upload Production Data', 'sidebar_quick_load': 'Quick Load', 'sidebar_format_hint': '**Expected TSV format:**\n- `date`: MM/DD/YYYY\n- `weight_kg`: Production weight\n- `material_type`: Material category\n- `shift`: day/night (optional)', 'ai_ready': 'AI Assistant Ready', 'ai_unavailable': 'AI Assistant Unavailable', 'ai_config_hint': 'To enable AI features, set GROQ_API_KEY as environment variable or in Streamlit secrets', 'data_uploaded': 'Data uploaded successfully', 'data_loaded': 'data loaded successfully', 'data_health': 'Data Health Check', 'section_material_overview': 'Material Overview', 'section_production_trends': 'Production Trends', 'section_materials_analysis': 'Materials Analysis', 'section_shift_analysis': 'Shift Analysis', 'section_quality_check': 'Quality Check', 'section_export': 'Export Reports', 'section_ai_insights': 'AI Insights', 'section_ai_config': 'AI Configuration', 'time_period': 'Time Period', 'select_materials': 'Select Materials', 'metric_total': 'Total Production', 'metric_daily_avg': 'Daily avg', 'quality_normal': 'All values normal', 'quality_outliers': 'outliers detected', 'quality_normal_range': 'Normal range', 'btn_generate_pdf': 'Generate PDF Report', 'btn_download_pdf': 'Download PDF Report', 'btn_generate_csv': 'Generate CSV Summary', 'btn_download_csv': 'Download CSV Summary', 'btn_download_raw': 'Download Raw Data', 'pdf_generating': 'Generating comprehensive PDF report...', 'pdf_success': 'PDF report generated successfully', 'pdf_failed': 'PDF generation failed', 'csv_success': 'CSV summary generated successfully', 'csv_failed': 'CSV generation failed', 'ai_quick_q1': 'How does production distribution on weekdays compare to weekends?', 'ai_quick_q2': 'Which material exhibits the most volatility in our dataset?', 'ai_quick_q3': 'To improve stability, which material or shift needs immediate attention?', 'ai_custom_placeholder': "e.g., 'Compare steel vs aluminum last month'", 'ai_ask_label': 'Ask about your production data:', 'ai_ask_btn': 'Ask AI', 'ai_analyzing': 'Analyzing...', 'welcome_title': 'How to Use This Platform', 'welcome_quick_start': 'Quick Start', 'welcome_features': 'Key Features', 'welcome_ready': 'Ready to start? Upload your production data or use Quick Load buttons to begin analysis', 'welcome_steps': '1. Upload your TSV data in the sidebar\n2. Or click Quick Load buttons for preset data\n3. View production by material type\n4. Analyze trends (daily/weekly/monthly)\n5. Check anomalies in Quality Check\n6. Export reports (PDF with AI, CSV)\n7. Ask the AI assistant for insights', 'welcome_features_list': '- Real-time interactive charts\n- One-click preset data loading\n- Time-period comparisons\n- Shift performance analysis\n- Outlier detection with dates\n- AI-powered PDF reports\n- Intelligent recommendations', 'ai_config_info': '**AI Assistant is currently unavailable.**\n\nTo enable AI features, configure your Groq API key:\n\n**Option 1: Environment Variable**\n```bash\nexport GROQ_API_KEY="your_api_key_here"\n```\n\n**Option 2: Streamlit Secrets**\nCreate `.streamlit/secrets.toml`:\n```toml\nGROQ_API_KEY = "your_api_key_here"\n```\n\nGet free API key at: https://console.groq.com/keys', 'chart_total_production': 'Total Production Trend', 'chart_total_production_weekly': 'Total Production Trend (Weekly)', 'chart_total_production_monthly': 'Total Production Trend (Monthly)', 'chart_materials_trends': 'Materials Production Trends', 'chart_materials_trends_weekly': 'Materials Production Trends (Weekly)', 'chart_materials_trends_monthly': 'Materials Production Trends (Monthly)', 'chart_shift_trends': 'Daily Shift Production Trends (Stacked)', 'chart_shift_trends_period': 'Shift Production Trends', 'label_date': 'Date', 'label_weight': 'Weight (kg)', 'label_week': 'Week', 'label_month': 'Month', 'label_material': 'Material', 'label_day_shift': 'Day Shift', 'label_night_shift': 'Night Shift' }, 'Norsk': { 'page_title': 'Produksjonsovervaking med AI-innsikt', 'page_subtitle': 'Nilsen Service & Consulting AS | Sanntidsanalyse og anbefalinger', 'sidebar_data_source': 'Datakilde', 'sidebar_upload': 'Last opp produksjonsdata', 'sidebar_quick_load': 'Hurtiglasting', 'sidebar_format_hint': '**Forventet TSV-format:**\n- `date`: MM/DD/YYYY\n- `weight_kg`: Produksjonsvekt\n- `material_type`: Materialkategori\n- `shift`: dag/natt (valgfritt)', 'ai_ready': 'AI-assistent klar', 'ai_unavailable': 'AI-assistent utilgjengelig', 'ai_config_hint': 'For a aktivere AI-funksjoner, sett GROQ_API_KEY som miljovariabel eller i Streamlit secrets', 'data_uploaded': 'Data lastet opp', 'data_loaded': 'data lastet inn', 'data_health': 'Datakvalitetssjekk', 'section_material_overview': 'Materialoversikt', 'section_production_trends': 'Produksjonstrender', 'section_materials_analysis': 'Materialanalyse', 'section_shift_analysis': 'Skiftanalyse', 'section_quality_check': 'Kvalitetskontroll', 'section_export': 'Eksporter rapporter', 'section_ai_insights': 'AI-innsikt', 'section_ai_config': 'AI-konfigurasjon', 'time_period': 'Tidsperiode', 'select_materials': 'Velg materialer', 'metric_total': 'Total produksjon', 'metric_daily_avg': 'Daglig gj.snitt', 'quality_normal': 'Alle verdier normale', 'quality_outliers': 'avvik funnet', 'quality_normal_range': 'Normalomrade', 'btn_generate_pdf': 'Generer PDF-rapport', 'btn_download_pdf': 'Last ned PDF-rapport', 'btn_generate_csv': 'Generer CSV-sammendrag', 'btn_download_csv': 'Last ned CSV-sammendrag', 'btn_download_raw': 'Last ned radata', 'pdf_generating': 'Genererer omfattende PDF-rapport...', 'pdf_success': 'PDF-rapport generert', 'pdf_failed': 'PDF-generering mislyktes', 'csv_success': 'CSV-sammendrag generert', 'csv_failed': 'CSV-generering mislyktes', 'ai_quick_q1': 'Hvordan er produksjonsfordelingen pa hverdager sammenlignet med helger?', 'ai_quick_q2': 'Hvilket materiale viser mest volatilitet i datasettet?', 'ai_quick_q3': 'For a forbedre stabilitet, hvilket materiale eller skift trenger umiddelbar oppmerksomhet?', 'ai_custom_placeholder': "f.eks. 'Sammenlign stal og aluminium forrige maned'", 'ai_ask_label': 'Still sporsmal om produksjonsdataene:', 'ai_ask_btn': 'Spor AI', 'ai_analyzing': 'Analyserer...', 'welcome_title': 'Slik bruker du plattformen', 'welcome_quick_start': 'Hurtigstart', 'welcome_features': 'Hovedfunksjoner', 'welcome_ready': 'Klar til a starte? Last opp produksjonsdata eller bruk Hurtiglasting-knappene', 'welcome_steps': '1. Last opp TSV-data i sidepanelet\n2. Eller klikk Hurtiglasting-knappene for forhandsinnstilte data\n3. Se produksjon etter materialtype\n4. Analyser trender (daglig/ukentlig/manedlig)\n5. Sjekk anomalier i Kvalitetskontroll\n6. Eksporter rapporter (PDF med AI, CSV)\n7. Still AI-assistenten sporsmal for innsikt', 'welcome_features_list': '- Sanntids interaktive diagrammer\n- Ett-klikks forhandsinnlasting\n- Tidsperiodesammenligninger\n- Skiftytelsesanalyse\n- Avviksdeteksjon med datoer\n- AI-drevne PDF-rapporter\n- Intelligente anbefalinger', 'ai_config_info': '**AI-assistent er for oyeblikket utilgjengelig.**\n\nFor a aktivere AI-funksjoner, konfigurer Groq API-nokkel:\n\n**Alternativ 1: Miljovariabel**\n```bash\nexport GROQ_API_KEY="din_api_nokkel_her"\n```\n\n**Alternativ 2: Streamlit Secrets**\nOpprett `.streamlit/secrets.toml`:\n```toml\nGROQ_API_KEY = "din_api_nokkel_her"\n```\n\nFa gratis API-nokkel pa: https://console.groq.com/keys', 'chart_total_production': 'Total produksjonstrend', 'chart_total_production_weekly': 'Total produksjonstrend (Ukentlig)', 'chart_total_production_monthly': 'Total produksjonstrend (Manedlig)', 'chart_materials_trends': 'Materialproduksjonstrender', 'chart_materials_trends_weekly': 'Materialproduksjonstrender (Ukentlig)', 'chart_materials_trends_monthly': 'Materialproduksjonstrender (Manedlig)', 'chart_shift_trends': 'Daglig skiftproduksjonstrend (Stablet)', 'chart_shift_trends_period': 'Skiftproduksjonstrender', 'label_date': 'Dato', 'label_weight': 'Vekt (kg)', 'label_week': 'Uke', 'label_month': 'Maned', 'label_material': 'Material', 'label_day_shift': 'Dagskift', 'label_night_shift': 'Nattskift' } } def get_translation(lang: str = 'English') -> dict: return TRANSLATIONS.get(lang, TRANSLATIONS['English']) class Settings: def __init__(self): self.environment = os.getenv("ENV", "development") @property def groq_api_key(self) -> Optional[str]: if key := os.getenv("GROQ_API_KEY"): return key try: import streamlit as st if key := st.secrets.get("GROQ_API_KEY"): return key except: pass if self.environment == "development": try: from dotenv import load_dotenv load_dotenv() return os.getenv("GROQ_API_KEY") except ImportError: pass return None @property def is_production(self) -> bool: return self.environment == "production" @lru_cache() def get_settings() -> Settings: return Settings() def get_css_styles() -> str: colors = DESIGN_SYSTEM['colors'] fonts = DESIGN_SYSTEM['fonts'] return f""" """ def get_chart_theme() -> dict: colors = DESIGN_SYSTEM['colors'] return { 'layout': { 'plot_bgcolor': 'white', 'paper_bgcolor': 'white', 'font': {'family': 'Inter, sans-serif', 'color': colors['text']}, 'colorway': [colors['primary'], colors['secondary'], colors['accent'], colors['warning']], 'margin': {'t': 60, 'b': 40, 'l': 40, 'r': 40} } }