import { tags } from "typia";
import { IIamportCardPayment } from "./IIamportCardPayment";
import { IIamportPaymentCancel } from "./IIamportPaymentCancel";
import { IIamportTransferPayment } from "./IIamportTransferPayment";
import { IIamportVBankPayment } from "./IIamportVBankPayment";
/**
 * 결제 정보.
 *
 * `IIamportPayment` 는 아임포트의 결제 정보를 형상화한 자료구조이자 유니언 타입의
 * 인터페이스로써, if condition 을 통하여 method 값을 특정하면, 파생 타입이 자동으로
 * 지정된다.
 *
 * ```typescript
 * if (payment.pay_method === "card")
 *    payment.card_number; // payment be IIamportCardPayment
 * ```
 *
 * @author Samchon
 */
export type IIamportPayment = IIamportCardPayment | IIamportTransferPayment | IIamportVBankPayment | IIamportPayment.IBase<Exclude<IIamportPayment.PayMethod, "card" | "samsung" | "trans" | "vbank">>;
export declare namespace IIamportPayment {
    /**
     * 결제 수단이 페이팔인 경우, 페이팔의 구매자 보호정책에 의해 결제 승인 시점에
     * Pending 상태를 만든 후, 내부 심사등을 통해 최종 결제 완료라고 변경함.
     *
     * `iamport` 의 기술적 이슈로 해당 상태를 status: failed 로 기록함. 추후
     * 페이팔에서 최종결제완료로 변경된 경우, `iamport` 에서 `paid` 로 변경 후,
     * 해당건에 대한 웹훅 발송. `iamport` 를 사용하는 고객사에서는, failed 로 이미
     * 처리된 결제건에 대한 paid 상태의 웹훅을 받는 문제점이 생김.
     *
     * 이에, `iamport` 에서 제공하는 `/payment/{imp_uid}` 에 query-string 으로
     * `extension=true` 옵션을 추가해야 함
     *
     * @issue https://github.com/samchon/fake-iamport-server/issues/13
     * @author Sangjin Han - https://github.com/ltnscp9028
     */
    interface IQuery {
        /**
         * 페이팔의 경우, 이 값을 `true` 로 할 것.
         */
        extension?: boolean;
    }
    /**
     * 웹훅 데이터.
     */
    interface IWebhook {
        /**
         * 결제 정보 {@link IIamportPayment} 의 식별자 키.
         */
        imp_uid: string;
        /**
         * 주문 식별자 키.
         *
         * 아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다.
         */
        merchant_uid: string;
        /**
         * 현재 상태.
         */
        status: Status;
    }
    /**
     * 결제 기본 (공통) 정보.
     */
    interface IBase<Method extends PayMethod> {
        pay_method: Method;
        /**
         * 결제 정보 {@link IIamportPayment} 의 식별자 키.
         */
        imp_uid: string;
        /**
         * 주문 식별자 키.
         *
         * 아임포트 서버가 아닌, 이를 사용하는 서비스가 자체적으로 발급하고 관리한다.
         */
        merchant_uid: string;
        /**
         * 주문명, 누락 가능.
         */
        name: null | string;
        /**
         * 결제 총액.
         */
        amount: number;
        /**
         * 결제 취소, 환불 총액.
         */
        cancel_amount: number;
        /**
         * 통화 단위.
         */
        currency: IIamportPayment.Currency;
        /**
         * 영수증 URL.
         */
        receipt_url: string & tags.Format<"uri">;
        /**
         * 현금 영수증 발행 여부.
         */
        cash_receipt_issue: boolean;
        channel: string;
        pg_provider: string;
        emb_pg_provider: null | string;
        pg_id: string;
        pg_tid: string;
        escrow: boolean;
        buyer_name: null | string;
        buyer_email: null | (string & tags.Format<"email">);
        buyer_tel: null | string;
        buyer_addr: null | string;
        buyer_postcode: null | string;
        customer_uid: null | string;
        customer_uid_usage: null | string;
        custom_data: null | string;
        user_agent: null | string;
        /**
         * 결제의 현재 (진행) 상태.
         */
        status: IIamportPayment.Status;
        /**
         * 결제 신청 일시.
         *
         * 리눅스 타임이 쓰임.
         */
        started_at: number;
        /**
         * 결제 (지불) 완료 일시.
         *
         * 리눅스 타임이 쓰이며, `null` 대신 0 을 씀.
         */
        paid_at: number;
        /**
         * 결제 실패 일시.
         *
         * 리눅스 타임이 쓰이며, `null` 대신 0 을 씀.
         */
        failed_at: number;
        /**
         * 결제 취소 일시.
         *
         * 리눅스 타임이 쓰이며, `null` 대신 0 을 씀.
         */
        cancelled_at: number;
        fail_reason: null | string;
        cancel_reason: null | string;
        cancel_history: IIamportPaymentCancel[];
    }
    type PayMethod = "card" | "trans" | "vbank" | "phone" | "samsung" | "kpay" | "kakaopay" | "payco" | "lpay" | "ssgpay" | "tosspay" | "cultureland" | "smartculture" | "happymoney" | "booknlife" | "point";
    type Status = "paid" | "ready" | "failed" | "cancelled";
    type Currency = "KRW" | "USD" | "EUR" | "JPY";
}
