#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you 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.

"""
Database commands for Paimon CLI.

This module provides database-related commands for the CLI.
"""

import json
import sys


def cmd_db_get(args):
    """
    Execute the 'db get' command.

    Gets and displays database information in JSON format.

    Args:
        args: Parsed command line arguments.
    """
    from pypaimon.cli.cli import load_catalog_config, create_catalog

    config = load_catalog_config(args.config)
    catalog = create_catalog(config)

    database_name = args.database

    try:
        database = catalog.get_database(database_name)
    except Exception as e:
        print(f"Error: Failed to get database '{database_name}': {e}", file=sys.stderr)
        sys.exit(1)

    result = {
        "name": database.name,
        "options": database.options if database.options else {},
    }
    if database.comment is not None:
        result["comment"] = database.comment

    print(json.dumps(result, indent=2, ensure_ascii=False))


def cmd_db_create(args):
    """
    Execute the 'db create' command.

    Creates a new database.

    Args:
        args: Parsed command line arguments.
    """
    from pypaimon.cli.cli import load_catalog_config, create_catalog

    config = load_catalog_config(args.config)
    catalog = create_catalog(config)

    database_name = args.database
    ignore_if_exists = args.ignore_if_exists

    # Parse properties if provided
    properties = None
    if args.properties:
        try:
            properties = json.loads(args.properties)
        except json.JSONDecodeError as e:
            print(f"Error: Invalid JSON format for properties: {e}", file=sys.stderr)
            sys.exit(1)

    try:
        catalog.create_database(database_name, ignore_if_exists, properties)
        print(f"Database '{database_name}' created successfully.")
    except Exception as e:
        print(f"Error: Failed to create database '{database_name}': {e}", file=sys.stderr)
        sys.exit(1)


def cmd_db_drop(args):
    """
    Execute the 'db drop' command.

    Drops an existing database.

    Args:
        args: Parsed command line arguments.
    """
    from pypaimon.cli.cli import load_catalog_config, create_catalog

    config = load_catalog_config(args.config)
    catalog = create_catalog(config)

    database_name = args.database
    ignore_if_not_exists = args.ignore_if_not_exists
    cascade = args.cascade

    try:
        catalog.drop_database(database_name, ignore_if_not_exists, cascade)
        print(f"Database '{database_name}' dropped successfully.")
    except Exception as e:
        print(f"Error: Failed to drop database '{database_name}': {e}", file=sys.stderr)
        sys.exit(1)


def cmd_db_alter(args):
    """
    Execute the 'db alter' command.

    Alters database properties by setting or removing properties.

    Args:
        args: Parsed command line arguments.
    """
    from pypaimon.cli.cli import load_catalog_config, create_catalog
    from pypaimon.catalog.rest.property_change import PropertyChange

    config = load_catalog_config(args.config)
    catalog = create_catalog(config)

    database_name = args.database

    changes = []

    # Parse set properties
    if args.set:
        try:
            set_properties = json.loads(args.set)
            if not isinstance(set_properties, dict):
                print("Error: --set value must be a JSON object.", file=sys.stderr)
                sys.exit(1)
            for key, value in set_properties.items():
                changes.append(PropertyChange.set_property(key, str(value)))
        except json.JSONDecodeError as e:
            print(f"Error: Invalid JSON format for --set: {e}", file=sys.stderr)
            sys.exit(1)

    # Parse remove properties
    if args.remove:
        for key in args.remove:
            changes.append(PropertyChange.remove_property(key))

    if not changes:
        print("Error: No changes specified. Use --set or --remove.", file=sys.stderr)
        sys.exit(1)

    try:
        catalog.alter_database(database_name, changes)
        print(f"Database '{database_name}' altered successfully.")
    except NotImplementedError as e:
        print(f"Error: {e}", file=sys.stderr)
        sys.exit(1)
    except Exception as e:
        print(f"Error: Failed to alter database '{database_name}': {e}", file=sys.stderr)
        sys.exit(1)


def cmd_db_list_tables(args):
    """
    Execute the 'db list-tables' command.

    Lists all tables in a database.

    Args:
        args: Parsed command line arguments.
    """
    from pypaimon.cli.cli import load_catalog_config, create_catalog

    config = load_catalog_config(args.config)
    catalog = create_catalog(config)

    database_name = args.database

    try:
        tables = catalog.list_tables(database_name)
    except Exception as e:
        print(f"Error: Failed to list tables in database '{database_name}': {e}", file=sys.stderr)
        sys.exit(1)

    if not tables:
        print(f"No tables found in database '{database_name}'.")
    else:
        for table_name in tables:
            print(table_name)


def add_db_subcommands(db_parser):
    """
    Add database subcommands to the parser.

    Args:
        db_parser: The db subparser to add commands to.
    """
    db_subparsers = db_parser.add_subparsers(dest='db_command', help='Database commands')

    # db get command
    get_parser = db_subparsers.add_parser('get', help='Get database information')
    get_parser.add_argument(
        'database',
        help='Database name'
    )
    get_parser.set_defaults(func=cmd_db_get)

    # db create command
    create_parser = db_subparsers.add_parser('create', help='Create a new database')
    create_parser.add_argument(
        'database',
        help='Database name'
    )
    create_parser.add_argument(
        '--properties', '-p',
        default=None,
        help='Database properties as JSON string (e.g., \'{"key1": "value1"}\')'
    )
    create_parser.add_argument(
        '--ignore-if-exists', '-i',
        action='store_true',
        help='Do not raise error if database already exists'
    )
    create_parser.set_defaults(func=cmd_db_create)

    # db drop command
    drop_parser = db_subparsers.add_parser('drop', help='Drop a database')
    drop_parser.add_argument(
        'database',
        help='Database name'
    )
    drop_parser.add_argument(
        '--ignore-if-not-exists', '-i',
        action='store_true',
        help='Do not raise error if database does not exist'
    )
    drop_parser.add_argument(
        '--cascade',
        action='store_true',
        help='Drop all tables in the database before dropping it'
    )
    drop_parser.set_defaults(func=cmd_db_drop)

    # db alter command
    alter_parser = db_subparsers.add_parser('alter', help='Alter database properties')
    alter_parser.add_argument(
        'database',
        help='Database name'
    )
    alter_parser.add_argument(
        '--set', '-s',
        default=None,
        help='Properties to set as JSON string (e.g., \'{"key1": "value1"}\')'
    )
    alter_parser.add_argument(
        '--remove', '-r',
        nargs='+',
        default=None,
        help='Property keys to remove'
    )
    alter_parser.set_defaults(func=cmd_db_alter)

    # db list-tables command
    list_tables_parser = db_subparsers.add_parser('list-tables', help='List all tables in a database')
    list_tables_parser.add_argument(
        'database',
        help='Database name'
    )
    list_tables_parser.set_defaults(func=cmd_db_list_tables)
