# ========= 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 os

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 _run(ws, cmd):
    print(f"\n>>> {cmd}")
    r = await ws.execute(cmd)
    out = (await r.stdout_str()).strip()
    err = await r.stderr_str()
    if out:
        for line in out.splitlines()[:10]:
            print(f"  {line[:140]}")
        total = len(out.splitlines())
        if total > 10:
            print(f"  ... ({total} lines total)")
    if err:
        print(f"  [stderr] {err.strip()[:160]}")
    if not out and not err:
        print(f"  (empty, exit={r.exit_code})")
    return r


async def main():
    ws = Workspace({"/pg": resource}, mode=MountMode.READ)

    print("=" * 60)
    print("LISTING (ls / tree)")
    print("=" * 60)

    await _run(ws, "ls /pg/")
    await _run(ws, "ls /pg/public/")
    await _run(ws, "ls /pg/public/tables/")
    await _run(ws, "ls /pg/public/views/")
    await _run(ws, "tree -L 2 /pg/public/")

    print("\n" + "=" * 60)
    print("SYNTHETIC JSON (database.json + per-entity schema.json)")
    print("=" * 60)

    await _run(ws, "cat /pg/database.json | head -n 30")

    table = "context_info"
    sch = f"/pg/public/tables/{table}/schema.json"
    await _run(ws, f'cat "{sch}" | head -n 25')

    print("\n" + "=" * 60)
    print("STAT and METADATA")
    print("=" * 60)

    fp = f"/pg/public/tables/{table}/rows.jsonl"
    await _run(ws, f'stat "{fp}"')

    print("\n" + "=" * 60)
    print("HEAD / TAIL / WC (predicate pushdown to SQL)")
    print("=" * 60)

    await _run(ws, f'head -n 3 "{fp}"')
    await _run(ws, f'tail -n 3 "{fp}"')
    await _run(ws, f'wc -l "{fp}"')

    print("\n" + "=" * 60)
    print("CAT with SIZE GUARD")
    print("=" * 60)
    print("(this should error: table has more rows than max_read_rows=200)")

    await _run(ws, f'cat "{fp}"')

    print("\n" + "=" * 60)
    print("GREP at different scopes (ILIKE pushdown)")
    print("=" * 60)

    await _run(ws, f'grep system "{fp}"')
    await _run(ws, f'grep -c system "{fp}"')
    await _run(ws, 'grep system /pg/public/tables/')
    await _run(ws, 'grep system /pg/public/')

    print("\n" + "=" * 60)
    print("RG at schema scope")
    print("=" * 60)

    await _run(ws, "rg system /pg/public/")

    print("\n" + "=" * 60)
    print("JQ over rows.jsonl (slice with head first to stay under guard)")
    print("=" * 60)

    await _run(ws, f'head -n 20 "{fp}" | jq -r ".[] | .id"')
    await _run(ws, f'head -n 20 "{fp}" | jq -r ".[] | .file_name"')

    print("\n" + "=" * 60)
    print("FIND")
    print("=" * 60)

    await _run(ws, 'find /pg/public/tables/ -name rows.jsonl')

    print("\n" + "=" * 60)
    print("CD + relative paths")
    print("=" * 60)

    await ws.execute("cd /pg/public/tables")
    await _run(ws, "pwd")
    await _run(ws, "ls")

    await resource.accessor.close()


if __name__ == "__main__":
    asyncio.run(main())
