# config/config.py 

from dataclasses import dataclass, field
from enum import Enum
from typing import Dict, Any, Optional

class GenerationStrategy(str, Enum):
    DEFAULT = "default"
    MAJORITY_VOTING = "majority_voting"
    BEST_OF_N = "best_of_n"
    BEAM_SEARCH = "beam_search"
    DVTS = "dvts"
    COT = "chain_of_thought"
    REACT = "react"

@dataclass
class ModelConfig:
    model_kwargs: Dict[str, Any] = field(default_factory=dict)
    tokenizer_kwargs: Dict[str, Any] = field(default_factory=dict)
    quantization_kwargs: Dict[str, Any] = field(default_factory=dict)

@dataclass
class GenerationConfig:
    num_samples: int = 5
    depth: int = 3
    breadth: int = 2
    max_history_turns: int = 1
    max_new_tokens: int = 50
    temperature: float = 0.7
    top_p: float = 0.9
    top_k: int = 50
    repetition_penalty: float = 1.1
    length_penalty: float = 1.0
    do_sample: bool = True
    strategy: GenerationStrategy = GenerationStrategy.DEFAULT

#####
from pydantic_settings import BaseSettings
from pathlib import Path
import torch

class Settings(BaseSettings):
    secret_key: str
    api_key: str 
    MODEL_NAME: str = "meta-llama/Llama-3.2-3B-Instruct"
    EMBEDDER_MODEL: str = "distiluse-base-multilingual-cased"
    CHUNK_SIZE: int = 1000
    CHUNK_OVERLAP: int = 100
    CSV_URL: str = 'https://www.bofrost.de/datafeed/DE/products.csv'
    PDF_FOLDER: Path = Path("./pdfs")
    DEVICE: str = "cuda" if torch.cuda.is_available() else "cpu"
    QUANTIZATION_BITS: int = 8
    FAQ_ROOT_URL: str = "https://www.bofrost.de/faq/"
    CACHE_DURATION: int = 3600
    MAX_RETRIES: int = 3
    TIMEOUT: int = 30

    class Config:
        extra = "allow"  # This allows additional fields beyond those defined in the class
        env_file = ".env"

settings = Settings()