from typing import Optional, List, Any, Dict, Union

class ZakatConfig:
    def __init__(
        self, 
        gold_price: str, 
        silver_price: str, 
        rice_price_kg: Optional[str] = None, 
        rice_price_liter: Optional[str] = None
    ) -> None: ...
    
    @property
    def gold_price(self) -> str: ...
    @property
    def silver_price(self) -> str: ...

class WealthType:
    Gold = 0
    Silver = 1
    Business = 2
    Agriculture = 3
    Livestock = 4
    Mining = 5
    Income = 6
    Investment = 7
    Fitrah = 8

class ZakatDetails:
    @property
    def wealth_type(self) -> WealthType: ...
    @property
    def net_assets(self) -> str: ...
    @property
    def zakat_due(self) -> str: ...
    @property
    def total_assets(self) -> str: ...
    @property
    def is_payable(self) -> bool: ...
    @property
    def nisab_threshold(self) -> str: ...
    @property
    def status_reason(self) -> Optional[str]: ...
    
    def to_dict(self) -> Dict[str, Any]: ...

class PreciousMetals:
    def __init__(self, weight: str = "0", metal_type: str = "gold", purity: int = 24) -> None: ...
    def calculate(self, config: ZakatConfig) -> ZakatDetails: ...

class BusinessZakat:
    def __init__(self, cash: str = "0", merchandise: str = "0", receivables: str = "0", liabilities: str = "0") -> None: ...
    def calculate(self, config: ZakatConfig) -> ZakatDetails: ...

class InvestmentAssets:
    def __init__(self, value: str = "0", investment_type: str = "stock", hawl_satisfied: bool = True) -> None: ...
    def calculate(self, config: ZakatConfig) -> ZakatDetails: ...

class IncomeZakatCalculator:
    def __init__(self, income: str, expenses: str = "0", method: str = "gross") -> None: ...
    def calculate(self, config: ZakatConfig) -> ZakatDetails: ...

class PortfolioResult:
    @property
    def total_zakat_due(self) -> str: ...
    @property
    def total_assets(self) -> str: ...
    def to_dict(self) -> Dict[str, Any]: ...

class ZakatPortfolio:
    def __init__(self) -> None: ...
    def add(self, item: Any) -> None: ...
    def calculate(self, config: ZakatConfig) -> PortfolioResult: ...
