#!/usr/bin/env python
import argparse
import urllib.parse
import textwrap

import psycopg2
import psycopg2.extras


def main():
    parser = argparse.ArgumentParser(
        description=textwrap.dedent("""
        Execute SQL on remote Postgres server.

        Example:
            pgcall postgres://user:pass@host:5432/mydb -c 'SELECT version()'
        """),
        formatter_class=argparse.RawDescriptionHelpFormatter,
    )

    parser.add_argument('db_url', nargs=1)
    parser.add_argument('-c', '--sql', required=True)
    args = parser.parse_args()

    db_url = urllib.parse.urlparse(args.db_url[0])

    with psycopg2.connect(
        dbname=db_url.path[1:],
        user=db_url.username,
        password=db_url.password,
        host=db_url.hostname,
        port=db_url.port,
    ) as conn:
        with conn.cursor(
            cursor_factory=psycopg2.extras.DictCursor
        ) as cur:
            cur.execute(args.sql)
            for row in cur:
                print(dict(row))


if __name__ == "__main__":
    main()