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

class CIMI::Service::MachineVolume < CIMI::Service::Base

  def self.find(instance_id, context, id=:all)
    if id == :all
      volumes = context.driver.storage_volumes(context.credentials)
      volumes.inject([]) do |attached, vol|
        id = context.machine_url(instance_id)+"/volumes/#{vol.id}"
        attached <<  self.new(context, :values => {
          :id => id,
          :name => vol.name || vol.id,
          :description => "MachineVolume #{vol.id} for Machine #{instance_id}",
          :created => vol.created.nil? ? nil : Time.parse(vol.created).xmlschema,
          :initial_location => vol.device,
          :volume => {:href=>context.volume_url(vol.id)},
          :operations => [{:href=>id, :rel => "delete" }]
        }) if vol.instance_id == instance_id
        attached
      end
    else
      vol = context.driver.storage_volume(context.credentials, {:id=>id})
      id = context.machine_url(instance_id)+"/volumes/#{vol.id}"
      raise CIMI::Model::NotFound unless vol.instance_id == instance_id
      self.new(context, :values => {
        :id => id,
        :name => vol.name || vol.id,
        :description => "MachineVolume #{vol.id} for Machine #{instance_id}",
        :created => vol.created.nil? ? nil : Time.parse(vol.created).xmlschema,
        :initial_location => vol.device,
        :volume => {:href=>context.volume_url(vol.id)},
        :operations => [{:href=>id, :rel => "delete" }]
      })
    end
  end

  def self.find_to_attach_from_xml(xml_in, context)
    xml = XmlSimple.xml_in(xml_in)
    vol_id = xml["volume"].first["href"].split("/").last
    location = xml["initialLocation"].first.strip
    [vol_id, location]
  end

  def self.find_to_attach_from_json(json_in, context)
    json = JSON.parse(json_in)
    vol_id = json["volume"]["href"].split("/").last
    location = json["initialLocation"]
    [vol_id, location]
  end


  def self.collection_for_instance(instance_id, context)
    machine_volumes = self.find(instance_id, context)
    volumes_url = context.url("/machines/#{instance_id}/volumes")
    # FIXME: Really ???
    attach_url = volumes_url.singularize+"_attach"
    CIMI::Model::MachineVolume.list(volumes_url, machine_volumes, :add_url => attach_url)
  end


end
