# -*- coding: utf-8 -*- #
# Copyright 2024 Google Inc. 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.
"""Client for interaction with Metadata Job API CRUD DATAPLEX."""


from googlecloudsdk.api_lib.dataplex import util as dataplex_api
from googlecloudsdk.calliope import exceptions


IMPORT_TYPE = 'IMPORT'
EXPORT_TYPE = 'EXPORT'


def GenerateMetadataJob(args):
  """Generates a Metadata Job."""
  if args.type == IMPORT_TYPE:
    module = dataplex_api.GetMessageModule()
    return module.GoogleCloudDataplexV1MetadataJob(
        labels=dataplex_api.CreateLabels(
            module.GoogleCloudDataplexV1MetadataJob, args
        ),
        type=module.GoogleCloudDataplexV1MetadataJob.TypeValueValuesEnum(
            args.type
        ),
        importSpec=GenerateImportMetadataJobSpec(args),
    )
  elif args.type == EXPORT_TYPE:
    module = dataplex_api.GetMessageModule()
    return module.GoogleCloudDataplexV1MetadataJob(
        labels=dataplex_api.CreateLabels(
            module.GoogleCloudDataplexV1MetadataJob, args
        ),
        type=module.GoogleCloudDataplexV1MetadataJob.TypeValueValuesEnum(
            args.type
        ),
        exportSpec=GenerateExportMetadataJobSpec(args),
    )
  raise exceptions.BadArgumentException(
      '--type', 'Current type is not supported in Gcloud.'
  )


def GenerateImportMetadataJobSpec(args):
  """Generates a Metadata Import Job Spec."""
  module = dataplex_api.GetMessageModule()
  import_job_spec = module.GoogleCloudDataplexV1MetadataJobImportJobSpec(
      aspectSyncMode=module.GoogleCloudDataplexV1MetadataJobImportJobSpec.AspectSyncModeValueValuesEnum(
          args.import_aspect_sync_mode
      ),
      entrySyncMode=module.GoogleCloudDataplexV1MetadataJobImportJobSpec.EntrySyncModeValueValuesEnum(
          args.import_entry_sync_mode
      ),
      scope=module.GoogleCloudDataplexV1MetadataJobImportJobSpecImportJobScope(
          entryGroups=args.import_entry_groups
          if args.import_entry_groups
          else [],
          glossaries=args.import_glossaries if args.import_glossaries else [],
          entryTypes=args.import_entry_types
          if args.import_entry_types
          else [],
          aspectTypes=args.import_aspect_types
          if args.import_aspect_types
          else [],
          entryLinkTypes=args.import_entry_link_types
          if args.import_entry_link_types
          else [],
          referencedEntryScopes=args.import_referenced_entry_scopes
          if args.import_referenced_entry_scopes
          else [],
      ),
      sourceCreateTime=args.import_source_create_time,
      sourceStorageUri=args.import_source_storage_uri,
  )
  if hasattr(args, 'import_log_level') and args.IsSpecified('import_log_level'):
    import_job_spec.logLevel = module.GoogleCloudDataplexV1MetadataJobImportJobSpec.LogLevelValueValuesEnum(
        args.import_log_level
    )
  return import_job_spec


def GenerateExportMetadataJobSpec(args):
  """Generates a Metadata Export Job Spec."""
  module = dataplex_api.GetMessageModule()
  export_job_spec = module.GoogleCloudDataplexV1MetadataJobExportJobSpec(
      outputPath=args.export_output_path,
      scope=module.GoogleCloudDataplexV1MetadataJobExportJobSpecExportJobScope(
          entryTypes=args.export_entry_types,
          aspectTypes=args.export_aspect_types,
      ),
  )
  if hasattr(args, 'export_organization_level') and args.IsSpecified(
      'export_organization_level'
  ):
    export_job_spec.scope.organizationLevel = args.export_organization_level
  elif hasattr(args, 'export_projects') and args.IsSpecified('export_projects'):
    export_job_spec.scope.projects = args.export_projects
  elif hasattr(args, 'export_entry_groups') and args.IsSpecified(
      'export_entry_groups'
  ):
    export_job_spec.scope.entryGroups = args.export_entry_groups
  return export_job_spec


def WaitForOperation(operation):
  """Waits for the given google.longrunning.Operation to complete."""
  return dataplex_api.WaitForOperation(
      operation,
      dataplex_api.GetClientInstance().projects_locations_metadataJobs,
  )
