import { createContext, useContext, useState, useEffect, ReactNode } from 'react';

type Language = 'en' | 'mr';

interface LanguageContextType {
  language: Language;
  toggleLanguage: () => void;
  t: (key: string) => string;
}

const translations = {
  en: {
    // App Name
    'app.name': 'Mirchi Trading',
    'app.tagline': 'Invoice & Inventory Management',
    
    // Navigation
    'nav.home': 'Home',
    'nav.invoice': 'Invoice',
    'nav.purchase': 'Purchase',
    'nav.stock': 'Stock',
    'nav.ledger': 'Ledger',
    
    // Dashboard
    'dashboard.title': 'Mirchi Trading',
    'dashboard.quickActions': 'Quick Actions',
    'dashboard.recentActivity': 'Recent Activity',
    'dashboard.totalSales': 'Total Sales',
    'dashboard.thisMonth': 'This Month',
    'dashboard.invoices': 'Invoices',
    'dashboard.totalCreated': 'Total Created',
    'dashboard.stockValue': 'Stock Value',
    'dashboard.currentStock': 'Current Stock',
    'dashboard.parties': 'Parties',
    'dashboard.tradingPartners': 'Trading Partners',
    
    // Quick Actions
    'action.newInvoice': 'New Invoice',
    'action.newPurchase': 'New Purchase',
    'action.stockReport': 'Stock Report',
    'action.partyLedger': 'Party Ledger',
    'action.billBooks': 'Bill Books',
    
    // Invoice
    'invoice.title': 'Invoice',
    'invoice.new': 'New Invoice',
    'invoice.billDetails': 'Bill Details',
    'invoice.billBook': 'Bill Book',
    'invoice.billNumber': 'Bill Number',
    'invoice.date': 'Date',
    'invoice.partyName': 'Party Name',
    'invoice.selectParty': 'Select Party',
    'invoice.itemDetails': 'Item Details',
    'invoice.selectItem': 'Select Item',
    'invoice.lotNumber': 'Lot Number',
    'invoice.selectLot': 'Select Lot',
    'invoice.bags': 'Bags',
    'invoice.grossWeight': 'Gross Weight',
    'invoice.netWeight': 'Net Weight',
    'invoice.rate': 'Rate',
    'invoice.amount': 'Amount',
    'invoice.charges': 'Additional Charges',
    'invoice.bardhana': 'Packing',
    'invoice.perBag': 'per bag',
    'invoice.hamali': 'Labor',
    'invoice.adhath': 'Commission',
    'invoice.cess': 'Cess',
    'invoice.gaadiBharni': 'Vehicle Loading',
    'invoice.summary': 'Summary',
    'invoice.itemTotal': 'Item Total',
    'invoice.grandTotal': 'Grand Total',
    'invoice.save': 'Save',
    'invoice.print': 'Print',
    'invoice.share': 'Share',
    'invoice.shareWhatsApp': 'Share on WhatsApp',
    'invoice.billNumberWarning': 'Changing bill number may cause issues. Use with caution.',
    
    // Purchase Entry
    'purchase.title': 'Purchase Entry',
    'purchase.inward': 'Inward',
    'purchase.basicInfo': 'Basic Information',
    'purchase.lotDetails': 'Lot Details',
    'purchase.addLot': 'Add Lot',
    'purchase.lotNumber': 'Lot Number',
    'purchase.variety': 'Variety',
    'purchase.selectVariety': 'Select Variety',
    'purchase.quality': 'Quality',
    'purchase.vehicleDetails': 'Vehicle Details',
    'purchase.vehicleNumber': 'Vehicle Number',
    'purchase.freight': 'Freight',
    'purchase.paymentDetails': 'Payment Details',
    'purchase.totalAmount': 'Total Amount',
    'purchase.advancePaid': 'Advance Paid',
    'purchase.remaining': 'Remaining',
    
    // Party Ledger
    'ledger.title': 'Party Ledger',
    'ledger.selectParty': 'Select Party',
    'ledger.currentBalance': 'Current Balance',
    'ledger.toReceive': 'To Receive',
    'ledger.toPay': 'To Pay',
    'ledger.credit': 'Credit',
    'ledger.debit': 'Debit',
    'ledger.balance': 'Balance',
    'ledger.particulars': 'Particulars',
    'ledger.reference': 'Reference',
    'ledger.search': 'Search',
    
    // Bill Books
    'billbook.title': 'Bill Books',
    'billbook.new': 'New Bill Book',
    'billbook.add': 'Add Bill Book',
    'billbook.name': 'Book Name',
    'billbook.serialFrom': 'First Number',
    'billbook.serialTo': 'Last Number',
    'billbook.active': 'Active',
    'billbook.currentNumber': 'Current Number',
    'billbook.remaining': 'Remaining Bills',
    'billbook.activate': 'Activate',
    
    // Common
    'common.save': 'Save',
    'common.cancel': 'Cancel',
    'common.add': 'Add',
    'common.edit': 'Edit',
    'common.delete': 'Delete',
    'common.search': 'Search',
    'common.filter': 'Filter',
    'common.export': 'Export',
    'common.print': 'Print',
    'common.back': 'Back',
    'common.next': 'Next',
    'common.previous': 'Previous',
    'common.close': 'Close',
    'common.confirm': 'Confirm',
    'common.yes': 'Yes',
    'common.no': 'No',
    'common.total': 'Total',
    'common.date': 'Date',
    'common.amount': 'Amount',
    'common.quantity': 'Quantity',
    'common.kg': 'kg',
    'common.bags': 'bags',
  },
  mr: {
    // App Name
    'app.name': 'मिर्ची ट्रेडिंग',
    'app.tagline': 'आवक-जावक व्यवस्थापन',
    
    // Navigation
    'nav.home': 'होम',
    'nav.invoice': 'जावक',
    'nav.purchase': 'आवक',
    'nav.stock': 'स्टॉक',
    'nav.ledger': 'लेजर',
    
    // Dashboard
    'dashboard.title': 'मिर्ची ट्रेडिंग',
    'dashboard.quickActions': 'त्वरित कार्ये',
    'dashboard.recentActivity': 'अलीकडील व्यवहार',
    'dashboard.totalSales': 'एकूण विक्री',
    'dashboard.thisMonth': 'या महिन्यात',
    'dashboard.invoices': 'जावक बिले',
    'dashboard.totalCreated': 'एकूण तयार केलेली',
    'dashboard.stockValue': 'माल मूल्य',
    'dashboard.currentStock': 'सध्याचा साठा',
    'dashboard.parties': 'पार्टी',
    'dashboard.tradingPartners': 'व्यापारी भागीदार',
    
    // Quick Actions
    'action.newInvoice': 'जावक बिल',
    'action.newPurchase': 'आवक एंट्री',
    'action.stockReport': 'स्टॉक रिपोर्ट',
    'action.partyLedger': 'पार्टी लेजर',
    'action.billBooks': 'बिल बुक्स',
    
    // Invoice
    'invoice.title': 'जावक बिल',
    'invoice.new': 'नवीन जावक बिल',
    'invoice.billDetails': 'बिल तपशील',
    'invoice.billBook': 'बिल बुक',
    'invoice.billNumber': 'बिल नंबर',
    'invoice.date': 'तारीख',
    'invoice.partyName': 'पार्टी नाव',
    'invoice.selectParty': 'पार्टी निवडा',
    'invoice.itemDetails': 'माल तपशील',
    'invoice.selectItem': 'माल निवडा',
    'invoice.lotNumber': 'लॉट नंबर',
    'invoice.selectLot': 'लॉट निवडा',
    'invoice.bags': 'पोत्या',
    'invoice.grossWeight': 'एकूण वजन',
    'invoice.netWeight': 'निव्वळ वजन',
    'invoice.rate': 'रेट',
    'invoice.amount': 'रक्कम',
    'invoice.charges': 'अतिरिक्त खर्च',
    'invoice.bardhana': 'बर्डाणा',
    'invoice.perBag': 'प्रति पोती',
    'invoice.hamali': 'हमाली',
    'invoice.adhath': 'अडत',
    'invoice.cess': 'सेस',
    'invoice.gaadiBharni': 'गाडी भरणी',
    'invoice.summary': 'सारांश',
    'invoice.itemTotal': 'एकूण रक्कम',
    'invoice.grandTotal': 'एकूण रक्कम',
    'invoice.save': 'जतन करा',
    'invoice.print': 'प्रिंट',
    'invoice.share': 'शेअर करा',
    'invoice.shareWhatsApp': 'WhatsApp वर शेअर करा',
    'invoice.billNumberWarning': 'बिल नंबर बदलल्यास समस्या येऊ शकतात. सावधगिरीने वापरा.',
    
    // Purchase Entry
    'purchase.title': 'आवक एंट्री',
    'purchase.inward': 'माल आला',
    'purchase.basicInfo': 'मूळ माहिती',
    'purchase.lotDetails': 'लॉट तपशील',
    'purchase.addLot': 'नवीन लॉट जोडा',
    'purchase.lotNumber': 'लॉट नंबर',
    'purchase.variety': 'जात',
    'purchase.selectVariety': 'जात निवडा',
    'purchase.quality': 'गुणवत्ता',
    'purchase.vehicleDetails': 'गाडी तपशील',
    'purchase.vehicleNumber': 'गाडी नंबर',
    'purchase.freight': 'भाडे',
    'purchase.paymentDetails': 'पेमेंट तपशील',
    'purchase.totalAmount': 'एकूण रक्कम',
    'purchase.advancePaid': 'अॅडव्हान्स दिले',
    'purchase.remaining': 'बाकी',
    
    // Party Ledger
    'ledger.title': 'पार्टी लेजर',
    'ledger.selectParty': 'पार्टी निवडा',
    'ledger.currentBalance': 'चालू बाकी',
    'ledger.toReceive': 'घेणे',
    'ledger.toPay': 'देणे',
    'ledger.credit': 'जमा',
    'ledger.debit': 'नावे',
    'ledger.balance': 'बाकी',
    'ledger.particulars': 'तपशील',
    'ledger.reference': 'संदर्भ',
    'ledger.search': 'शोधा',
    
    // Bill Books
    'billbook.title': 'बिल बुक्स',
    'billbook.new': 'नवीन बिल बुक',
    'billbook.add': 'बिल बुक जोडा',
    'billbook.name': 'बुकचे नाव',
    'billbook.serialFrom': 'पहिला नंबर',
    'billbook.serialTo': 'शेवटचा नंबर',
    'billbook.active': 'सक्रिय',
    'billbook.currentNumber': 'चालू नंबर',
    'billbook.remaining': 'शिल्लक बिले',
    'billbook.activate': 'सक्रिय करा',
    
    // Common
    'common.save': 'जतन करा',
    'common.cancel': 'रद्द करा',
    'common.add': 'जोडा',
    'common.edit': 'बदला',
    'common.delete': 'काढा',
    'common.search': 'शोधा',
    'common.filter': 'फिल्टर',
    'common.export': 'एक्सपोर्ट',
    'common.print': 'प्रिंट',
    'common.back': 'मागे',
    'common.next': 'पुढे',
    'common.previous': 'मागील',
    'common.close': 'बंद करा',
    'common.confirm': 'खात्री करा',
    'common.yes': 'होय',
    'common.no': 'नाही',
    'common.total': 'एकूण',
    'common.date': 'तारीख',
    'common.amount': 'रक्कम',
    'common.quantity': 'संख्या',
    'common.kg': 'kg',
    'common.bags': 'पोत्या',
  }
};

const LanguageContext = createContext<LanguageContextType | undefined>(undefined);

export function LanguageProvider({ children }: { children: ReactNode }) {
  const [language, setLanguage] = useState<Language>(() => {
    // Load from localStorage or default to Marathi
    const saved = localStorage.getItem('language');
    return (saved === 'en' || saved === 'mr') ? saved : 'mr';
  });

  useEffect(() => {
    // Save to localStorage whenever language changes
    localStorage.setItem('language', language);
    // Update document direction if needed (for future RTL support)
    document.documentElement.lang = language === 'mr' ? 'mr' : 'en';
  }, [language]);

  const toggleLanguage = () => {
    setLanguage(prev => prev === 'en' ? 'mr' : 'en');
  };

  const t = (key: string): string => {
    return translations[language][key as keyof typeof translations['en']] || key;
  };

  return (
    <LanguageContext.Provider value={{ language, toggleLanguage, t }}>
      {children}
    </LanguageContext.Provider>
  );
}

export function useLanguage() {
  const context = useContext(LanguageContext);
  if (!context) {
    throw new Error('useLanguage must be used within a LanguageProvider');
  }
  return context;
}
