# 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.

from pyhugegraph.client import PyHugeClient

if __name__ == "__main__":
    client = PyHugeClient(
        "127.0.0.1", "8080", user="admin", pwd="admin", graph="hugegraph", graphspace=None
    )

    """schema"""
    schema = client.schema()
    schema.propertyKey("name").asText().ifNotExist().create()
    schema.propertyKey("birthDate").asText().ifNotExist().create()
    schema.vertexLabel("Person").properties(
        "name", "birthDate"
    ).usePrimaryKeyId().primaryKeys("name").ifNotExist().create()
    schema.vertexLabel("Movie").properties("name").usePrimaryKeyId().primaryKeys(
        "name"
    ).ifNotExist().create()
    schema.edgeLabel("ActedIn").sourceLabel("Person").targetLabel(
        "Movie"
    ).ifNotExist().create()

    print(schema.getVertexLabels())
    print(schema.getEdgeLabels())
    print(schema.getRelations())

    """graph"""
    g = client.graph()
    # add Vertex
    p1 = g.addVertex("Person", {"name": "Al Pacino", "birthDate": "1940-04-25"})
    p2 = g.addVertex("Person", {"name": "Robert De Niro", "birthDate": "1943-08-17"})
    m1 = g.addVertex("Movie", {"name": "The Godfather"})
    m2 = g.addVertex("Movie", {"name": "The Godfather Part II"})
    m3 = g.addVertex(
        "Movie", {"name": "The Godfather Coda The Death of Michael Corleone"}
    )

    # add Edge
    g.addEdge("ActedIn", p1.id, m1.id, {})
    g.addEdge("ActedIn", p1.id, m2.id, {})
    g.addEdge("ActedIn", p1.id, m3.id, {})
    g.addEdge("ActedIn", p2.id, m2.id, {})

    # update property
    # g.eliminateVertex("vertex_id", {"property_key": "property_value"})

    print(g.getVertexById(p1.id).label)
    # g.removeVertexById("12:Al Pacino")
    g.close()

    """gremlin"""
    g = client.gremlin()
    print("gremlin.exec: ", g.exec("g.V().limit(10)"))

    """graphs"""
    g = client.graphs()
    print("get_graph_info: ", g.get_graph_info())
    print("get_all_graphs: ", g.get_all_graphs())
    print("get_version: ", g.get_version())
    print("get_graph_config: ", g.get_graph_config())
