import os import json import logging from pathlib import Path from datetime import datetime from config import THESIS_DIR class TermWorkspace: """Manage all files for a single term study.""" def __init__(self, term: str, category: str): self.term = term self.category = category self.safe = term.replace(" ", "_") category_name = category # "tadeel" or "jarh" used directly in path self.base = THESIS_DIR / "01_terms" / category_name / self.safe self.raw_dir = self.base / "raw" self.ai_dir = self.base / "ai-output" self.processed_dir = self.base / "processed" self.docx_dir = self.base / "docx" self.logs_dir = self.base / "logs" self._dirs_created = False def _ensure_dirs(self): if self._dirs_created: return for d in [ self.raw_dir, self.ai_dir, self.processed_dir, self.docx_dir, self.logs_dir, ]: d.mkdir(parents=True, exist_ok=True) self._dirs_created = True def save_raw_search(self, draft: dict): self._ensure_dirs() path = self.raw_dir / "search_results.json" path.write_text( json.dumps(draft, ensure_ascii=False, indent=2), encoding="utf-8" ) return path def save_raw_draft_md(self, md_text: str): self._ensure_dirs() path = self.raw_dir / "draft.md" path.write_text(md_text, encoding="utf-8") return path def save_research_before_ai(self, content: str): self._ensure_dirs() path = self.raw_dir / "research-before-ai.md" path.write_text(content, encoding="utf-8") return path def save_prompt(self, prompt_text: str, section_name: str = "full"): self._ensure_dirs() path = self.raw_dir / f"prompt-{section_name}.md" path.write_text(prompt_text, encoding="utf-8") return path def save_ai_section(self, section_num: int, section_name: str, content: str): self._ensure_dirs() path = self.ai_dir / f"section_{section_num:02d}_{section_name}.md" path.write_text(content, encoding="utf-8") return path def save_ai_full(self, content: str): self._ensure_dirs() path = self.ai_dir / "full_raw.md" path.write_text(content, encoding="utf-8") return path def save_processed(self, content: str, filename: str = "study.md"): self._ensure_dirs() path = self.processed_dir / filename path.write_text(content, encoding="utf-8") return path def save_docx(self, content: bytes, filename: str = None): self._ensure_dirs() if filename is None: filename = f"{self.safe}.docx" path = self.docx_dir / filename path.write_bytes(content) return path def get_log_path(self, log_type: str = "general") -> Path: return self.logs_dir / f"{log_type}.log" def save_meta(self, meta: dict): self._ensure_dirs() path = self.base / "meta.json" existing = {} if path.exists(): existing = json.loads(path.read_text(encoding="utf-8")) existing.update(meta) existing["last_updated"] = datetime.now().isoformat() path.write_text( json.dumps(existing, ensure_ascii=False, indent=2), encoding="utf-8" ) return path def load_meta(self) -> dict: path = self.base / "meta.json" if path.exists(): return json.loads(path.read_text(encoding="utf-8")) return {}