class Kamal::Commands::Builder::Base

def build_args

def build_args
  argumentize "--build-arg", args, sensitive: true
end

def build_cache

def build_cache
  if cache_to && cache_from
    [ "--cache-to", cache_to,
      "--cache-from", cache_from ]
  end
end

def build_context

def build_context
  config.builder.context
end

def build_dockerfile

def build_dockerfile
  if Pathname.new(File.expand_path(dockerfile)).exist?
    argumentize "--file", dockerfile
  else
    raise BuilderError, "Missing #{dockerfile}"
  end
end

def build_labels

def build_labels
  argumentize "--label", { service: config.service }
end

def build_options

def build_options
  [ *build_tags, *build_cache, *build_labels, *build_args, *build_secrets, *build_dockerfile, *build_ssh ]
end

def build_secrets

def build_secrets
  argumentize "--secret", secrets.collect { |secret| [ "id", secret ] }
end

def build_ssh

def build_ssh
  argumentize "--ssh", ssh if ssh.present?
end

def build_tags

def build_tags
  [ "-t", config.absolute_image, "-t", config.latest_image ]
end

def builder_config

def builder_config
  config.builder
end

def clean

def clean
  docker :image, :rm, "--force", config.absolute_image
end

def pull

def pull
  docker :pull, config.absolute_image
end

def push

def push
  if git_archive?
    pipe \
      git(:archive, "--format=tar", :HEAD),
      build_and_push
  else
    build_and_push
  end
end

def validate_image

def validate_image
  pipe \
    docker(:inspect, "-f", "'{{ .Config.Labels.service }}'", config.absolute_image),
    any(
      [ :grep, "-x", config.service ],
      "(echo \"Image #{config.absolute_image} is missing the 'service' label\" && exit 1)"
    )
end