# rubocop:disable Metrics/MethodLength
module Actions
  module Pulp3
    module Orchestration
      module Repository
        class ImportUpload < Pulp3::Abstract
          # rubocop:disable Metrics/AbcSize
          def plan(repository, smart_proxy, args)
            file = {:filename => args.dig(:unit_key, :name), :sha256 => args.dig(:unit_key, :checksum) }
            content_unit_href = args.dig(:unit_key, :content_unit_id)
            docker_tag = (args.dig(:unit_type_id) == "docker_tag")
            sequence do
              if content_unit_href
                content_backend_service = SmartProxy.pulp_primary.content_service(args.dig(:unit_type_id))
                duplicate_sha_path_content_list = content_backend_service.content_api.list(
                    "sha256": file[:sha256],
                    "relative_path": file[:filename])
                duplicate_content_href = duplicate_sha_path_content_list&.results&.first&.pulp_href
                if duplicate_content_href
                  plan_self(:commit_output => [], :content_unit_href => duplicate_content_href)
                  action_output = plan_action(Pulp3::Repository::ImportUpload, duplicate_content_href, repository, smart_proxy).output
                  plan_action(Pulp3::Repository::SaveVersion, repository, tasks: action_output[:pulp_tasks]).output
                else
                  duplicate_sha_artifact_list = ::Katello::Pulp3::Api::Core.new(smart_proxy).artifacts_api.list("sha256": file[:sha256])
                  duplicate_sha_artifact_href = duplicate_sha_artifact_list&.results&.first&.pulp_href
                  if duplicate_sha_artifact_href
                    artifact_output = plan_action(Pulp3::Repository::SaveArtifact,
                                                         file, repository, smart_proxy,
                                                         nil, args.dig(:unit_type_id),
                                                         artifact_href: duplicate_sha_artifact_href).output
                    content_unit_href = artifact_output[:pulp_tasks]
                    plan_self(:commit_output => nil, :artifact_output => artifact_output[:pulp_tasks])
                    action_output = plan_action(Pulp3::Repository::ImportUpload, content_unit_href, repository, smart_proxy).output
                    plan_action(Pulp3::Repository::SaveVersion, repository, tasks: action_output[:pulp_tasks]).output
                  end
                end
              elsif docker_tag
                tag_manifest_output = plan_action(Pulp3::Repository::UploadTag,
                            repository,
                            smart_proxy,
                            args).output
                plan_self(:commit_output => tag_manifest_output[:pulp_tasks])
                plan_action(Pulp3::Repository::SaveVersion, repository, {force_fetch_version: true, tasks: tag_manifest_output[:pulp_tasks]})
              else
                commit_output = plan_action(Pulp3::Repository::CommitUpload,
                                            repository,
                                            smart_proxy,
                                            "/pulp/api/v3/uploads/" + args.dig(:upload_id) + "/",
                                            args.dig(:unit_key, :checksum)).output

                artifact_output = plan_action(Pulp3::Repository::SaveArtifact,
                                              file,
                                              repository,
                                              smart_proxy,
                                              commit_output[:pulp_tasks],
                                              args.dig(:unit_type_id)).output
                content_unit_href = artifact_output[:pulp_tasks]
                plan_self(:commit_output => commit_output[:pulp_tasks], :artifact_output => artifact_output[:pulp_tasks])
                action_output = plan_action(Pulp3::Repository::ImportUpload, content_unit_href, repository, smart_proxy).output
                plan_action(Pulp3::Repository::SaveVersion, repository, tasks: action_output[:pulp_tasks]).output
              end
            end
          end

          def run
            output[:pulp_tasks] = input[:commit_output]
            if input[:content_unit_href]
              output[:content_unit_href] = input[:content_unit_href]
            elsif input[:artifact_output]
              output[:content_unit_href] = input[:artifact_output].last[:created_resources].first
            else
              output[:content_unit_href] = nil
            end
          end
        end
      end
    end
  end
end