require_relative "../../../lib/buckybox/api"

RSpec.describe BuckyBox::API, :vcr do
  let(:api) do
    BuckyBox::API.new(
      "API-Key" => ENV.fetch("BUCKYBOX_API_KEY", ""),
      "API-Secret" => ENV.fetch("BUCKYBOX_API_SECRET", ""),
    )
  end

  let(:box_id) { 217 }
  let(:delivery_service_id) { 91 }
  let(:customer_id) { 8859 }

  before do
    method = self.class.metadata[:parent_example_group][:description][1..-1]
    VCR.insert_cassette "/#{method}"
  end

  after do
    VCR.eject_cassette
  end

  shared_examples_for "a valid API response" do
    let(:response) { subject }

    specify { expect { response }.not_to raise_error }
    specify { expect([BuckyBox::API::Response, Array]).to include response.class }
  end

  describe "#boxes" do
    subject { api.boxes(embed: "images") }
    it_behaves_like "a valid API response"
  end

  describe "#box" do
    subject { api.box(box_id) }
    it_behaves_like "a valid API response"
  end

  describe "#delivery_services" do
    subject { api.delivery_services }
    it_behaves_like "a valid API response"
  end

  describe "#delivery_service" do
    subject { api.delivery_service(delivery_service_id) }
    it_behaves_like "a valid API response"
  end

  describe "#webstore" do
    subject { api.webstore }
    it_behaves_like "a valid API response"
  end

  describe "#customers" do
    subject { api.customers(email: "joe@buckybox.com") }
    it_behaves_like "a valid API response"
  end

  describe "#customer" do
    subject { api.customer(customer_id, embed: "address") }
    it_behaves_like "a valid API response"
  end

  describe "#authenticate_customer" do
    subject { api.authenticate_customer(email: "joe@buckybox.com", password: "nope") }
    it_behaves_like "a valid API response"
  end

  describe "#create_or_update_customer" do
    let(:customer) do
      {
        id: customer_id,
        first_name: "Joe",
      }
    end

    subject { api.create_or_update_customer(JSON.dump(customer)) }
    it_behaves_like "a valid API response"
  end

  describe "#create_order" do
    let(:order) do
      {
        customer_id: customer_id,
        box_id: box_id,
        start_date: "2016-08-09",
        week_days: [2],
        frequency: "single",
        payment_method: "cash_on_delivery",
      }
    end

    subject { api.create_order(JSON.dump(order)) }
    it_behaves_like "a valid API response"
  end
end