File size: 4,547 Bytes
3998131
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
"""
Public Interface for Module C (Letter Generation)
"""

import logging
from typing import List, Dict, Any
from .generator import LetterGenerator

logger = logging.getLogger(__name__)

class LetterGenerationAPI:
    """
    Main API for the Letter Generation module.
    """
    
    def __init__(self):
        self.generator = LetterGenerator()
        
    def get_available_templates(self) -> List[str]:
        """
        Get a list of all available letter templates.
        """
        return self.generator.loader.list_templates()
        
    def generate_letter(self, template_name: str, user_data: Dict[str, str]) -> Dict[str, Any]:
        """
        Generate a letter using structured data.
        """
        try:
            letter = self.generator.generate_letter(template_name, user_data)
            return {
                "success": True,
                "letter": letter,
                "method": "template_fill"
            }
        except Exception as e:
            logger.error(f"Generation failed: {e}")
            return {
                "success": False,
                "error": str(e)
            }

    def analyze_requirements(self, description: str) -> Dict[str, Any]:
        """
        Analyze description to find missing information.
        """
        try:
            return self.generator.analyze_requirements(description)
        except Exception as e:
            logger.error(f"Analysis failed: {e}")
            return {"success": False, "error": str(e)}

    def search_template(self, query: str) -> Dict[str, Any]:
        """
        Search for a suitable template based on user query.
        """
        try:
            # Lazy import
            from .retriever import TemplateRetriever
            retriever = TemplateRetriever()
            results = retriever.retrieve_templates(query, k=1)
            
            if results:
                best = results[0]
                return {
                    "success": True,
                    "template_name": best['filename'],
                    "score": best['score'],
                    "content": best['content'] # Optional: return content preview
                }
            else:
                return {"success": False, "error": "No template found"}
        except Exception as e:
            logger.error(f"Search failed: {e}")
            return {"success": False, "error": str(e)}

    def get_template_details(self, template_name: str) -> Dict[str, Any]:
        """
        Get details (placeholders, content) for a specific template.
        """
        try:
            content = self.generator.loader.load_template(template_name)
            placeholders = self.generator.loader.extract_placeholders(content)
            return {
                "success": True,
                "template_name": template_name,
                "placeholders": list(placeholders),
                "content": content
            }
        except Exception as e:
            logger.error(f"Get details failed: {e}")
            return {"success": False, "error": str(e)}

    def fill_template(self, template_name: str, user_data: Dict[str, str]) -> Dict[str, Any]:
        """
        Fill a specific template with provided data (Simple Substitution).
        """
        try:
            letter = self.generator.generate_letter(template_name, user_data)
            return {
                "success": True,
                "letter": letter,
                "method": "simple_fill"
            }
        except Exception as e:
            logger.error(f"Fill failed: {e}")
            return {"success": False, "error": str(e)}

    def generate_smart_letter(self, description: str, template_name: str = None, additional_data: Dict[str, str] = None) -> Dict[str, Any]:
        """
        Generate a letter using a natural language description (RAG-based).
        Optional: template_name to skip retrieval and use specific template.
        Optional: additional_data dict to fill specific missing fields.
        """
        try:
            # New signature: only description needed, template is retrieved automatically
            result = self.generator.generate_from_description(description, additional_data, template_name)
            if result['success']:
                result["method"] = "rag_generation"
            return result
        except Exception as e:
            logger.error(f"Smart generation failed: {e}")
            return {
                "success": False,
                "error": str(e)
            }