from pathlib import Path
from typing import Any

from sqlalchemy.orm import Session

from app.config import settings
from app.services.storage.minio import MinioService

from common_logging import get_logger

logger = get_logger(__name__)




class FileExportService:

    def __init__(self, db: Session):
        self.db = db
        self.minio = MinioService(
            endpoint=settings.MINIO_ENDPOINT,
            access_key=settings.MINIO_ACCESS_KEY,
            secret_key=settings.MINIO_SECRET_KEY,
            secure=settings.MINIO_SECURE,
        )

    def export_tenant_files(self, tenant_id: int, output_dir: Path) -> dict[str, Any]:
        output_dir.mkdir(parents=True, exist_ok=True)
        documents = self._get_tenant_documents(tenant_id)
        downloaded = 0
        for doc in documents:
            if doc.get("file_path"):
                try:
                    file_path = output_dir / doc["file_path"]
                    file_path.parent.mkdir(parents=True, exist_ok=True)
                    self.minio.download_file(
                        bucket_name=settings.MINIO_BUCKET,
                        object_name=doc["file_path"],
                        file_path=str(file_path),
                    )
                    downloaded += 1
                except Exception as e:
                    logger.error(f"Failed to download {doc['file_path']}: {e}")
        return {
            "output_dir": str(output_dir),
            "stats": {"total_documents": len(documents), "downloaded": downloaded},
        }

    def _get_tenant_documents(self, tenant_id: int) -> list[dict[str, Any]]:
        from sqlalchemy import text


        schema_name = f"tenant_{tenant_id}"
        query = text(
            f"\n        SELECT id, file_path, title\n        FROM {schema_name}.knowledge_documents\n        WHERE is_deleted = false AND file_path IS NOT NULL\n        "
        )
        result = self.db.execute(query)
        return [{"id": r[0], "file_path": r[1], "title": r[2]} for r in result]
