/*
 * Copyright (C) 2019 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */

#import "config.h"
#import "PaymentMethodUpdate.h"

#if ENABLE(APPLE_PAY)

#import "PaymentSummaryItems.h"
#import <pal/cocoa/PassKitSoftLink.h>

namespace WebCore {

PaymentMethodUpdate::PaymentMethodUpdate(LineItem&& total, Vector<LineItem>&& lineItems)
    : m_totalAndLineItems { { WTFMove(total), WTFMove(lineItems) } }
    , m_platformUpdate { adoptNS([PAL::allocPKPaymentRequestPaymentMethodUpdateInstance() initWithPaymentSummaryItems:platformSummaryItems(*m_totalAndLineItems)]) }
{
}

PaymentMethodUpdate::PaymentMethodUpdate(RetainPtr<PKPaymentRequestPaymentMethodUpdate>&& platformUpdate)
    : m_platformUpdate { WTFMove(platformUpdate) }
{
}

PaymentMethodUpdate::PaymentMethodUpdate(TotalAndLineItems&& totalAndLineItems)
    : PaymentMethodUpdate { WTFMove(totalAndLineItems.total), WTFMove(totalAndLineItems.lineItems) }
{
}

const PaymentMethodUpdate::TotalAndLineItems& PaymentMethodUpdate::totalAndLineItems() const
{
    return *m_totalAndLineItems;
}

PKPaymentRequestPaymentMethodUpdate *PaymentMethodUpdate::platformUpdate() const
{
    return m_platformUpdate.get();
}

} // namespace WebCore

#endif // ENABLE(APPLE_PAY)
