"""Remove extra projects without touching the kept OpenAI reviewer demo.

Dry-run by default. Use ``--execute`` only against the intended production
database after reviewing the printed project/grant list.
"""
from __future__ import annotations

import argparse
import asyncio
import sys
from datetime import datetime, timezone
from pathlib import Path
from uuid import UUID

ROOT = Path(__file__).resolve().parents[1]
if str(ROOT) not in sys.path:
    sys.path.insert(0, str(ROOT))

from sqlalchemy import select

from src.core.database import async_session_factory
from src.core.orm_import import import_all_orm_models
from src.domain.projects.models import Project

import_all_orm_models()

WORKSPACE_ID = UUID("2d3aa532-1e20-4f6d-9eb8-be42d897345a")
KEEP_PROJECT_ID = UUID("c13ed1e9-12e7-440d-8a34-2e10c4f2801d")


async def main(execute: bool) -> None:
    async with async_session_factory() as db:
        projects = list(
            (
                await db.scalars(
                    select(Project)
                    .where(Project.workspace_id == WORKSPACE_ID)
                    .order_by(Project.created_at, Project.id)
                )
            ).all()
        )
        print(f"Workspace: {WORKSPACE_ID}")
        print("Projects:")
        for project in projects:
            keep = project.id == KEEP_PROJECT_ID
            print(f"  {'KEEP' if keep else 'DELETE'} {project.id} {project.name!r} deleted_at={project.deleted_at}")
        if not execute:
            print("Dry run only. Re-run with --execute to apply this cleanup.")
            return

        now = datetime.now(timezone.utc)
        for project in projects:
            if project.id != KEEP_PROJECT_ID and project.deleted_at is None:
                project.deleted_at = now
        await db.commit()
        print("Cleanup applied. The kept project and all authorizations were not modified.")


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("--execute", action="store_true", help="Apply the cleanup; otherwise print a dry run")
    args = parser.parse_args()
    asyncio.run(main(args.execute))
