# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========

import asyncio
import json
import os
import sys

from dotenv import load_dotenv

from mirage import MountMode, Workspace
from mirage.resource.postgres import PostgresConfig, PostgresResource

load_dotenv(".env.development")

config = PostgresConfig(
    dsn=os.environ["POSTGRES_DSN"],
    max_read_rows=200,
    max_read_bytes=1024 * 1024,
)
resource = PostgresResource(config=config)


async def main():
    with Workspace({"/pg/": resource}, mode=MountMode.READ) as ws:
        vos = sys.modules["os"]
        print("=== VFS MODE: open() reads from Postgres ===\n")

        print("--- os.listdir(/pg) — root entries ---")
        for e in vos.listdir("/pg"):
            print(f"  {e}")

        print("\n--- read /pg/database.json ---")
        with open("/pg/database.json") as f:
            db_json = json.loads(f.read())
        print(f"  database: {db_json['database']}")
        print(f"  schemas: {db_json['schemas']}")
        print(f"  tables: {len(db_json['tables'])} | "
              f"views: {len(db_json['views'])} | "
              f"relationships: {len(db_json['relationships'])}")

        if "public" not in db_json["schemas"]:
            print("\nno public schema")
            return

        print("\n--- os.listdir(/pg/public) ---")
        for e in vos.listdir("/pg/public"):
            print(f"  {e}")

        print("\n--- os.listdir(/pg/public/tables) ---")
        tables = vos.listdir("/pg/public/tables")
        for t in tables[:5]:
            print(f"  {t}")
        if len(tables) > 5:
            print(f"  ... ({len(tables)} total)")

        if not tables:
            print("no tables in public")
            return

        target = tables[0]
        entity_dir = f"/pg/public/tables/{target}"

        print(f"\n--- os.listdir({entity_dir}) ---")
        for e in vos.listdir(entity_dir):
            print(f"  {e}")

        sch_path = f"{entity_dir}/schema.json"
        print(f"\n--- read {sch_path} ---")
        with open(sch_path) as f:
            sch = json.loads(f.read())
        print(f"  name={sch['name']} kind={sch['kind']}")
        print(f"  columns: {[c['name'] for c in sch['columns'][:6]]}" +
              (" ..." if len(sch["columns"]) > 6 else ""))
        print(f"  primary_key: {sch['primary_key']}")
        print(f"  foreign_keys: {len(sch['foreign_keys'])}")
        print(f"  row_count_estimate: {sch['row_count_estimate']}")

        rows_path = f"{entity_dir}/rows.jsonl"
        print("\n--- open() rows.jsonl (may hit size guard) ---")
        try:
            with open(rows_path) as f:
                content = f.read()
            lines = [ln for ln in content.strip().split("\n") if ln.strip()]
            print(f"  rows returned: {len(lines)}")
            for line in lines[:3]:
                doc = json.loads(line)
                print(f"  {json.dumps(doc)[:120]}")
        except Exception as exc:
            print(f"  guard fired: {str(exc)[:160]}")

        print("\n--- session observer ---")
        day_folders = vos.listdir("/.sessions")
        log_entries = vos.listdir(day_folders[0]) if day_folders else []
        for e in log_entries:
            print(f"  {e}")

        records = ws.ops.records
        total = sum(r.bytes for r in records)
        print(f"\nStats: {len(records)} ops, {total} bytes transferred")

    await resource.accessor.close()


asyncio.run(main())
