import { OrderAttribute } from '../common/attributes'
import { IdParam, PagingQuery } from '../common/types'
import { Ticket } from '../event/types'

export type TicketFormatType = 'PDF' | 'SECURE' | 'PKPASS'

/**
 * Payload for order creation
 *
 * @param orderItem Array of `OrderItem`s
 * @param format Format of the tickets (PDF, SECURE or PKPASS)
 * @param holdToken Hold token for seat reservation generated on Seats.io (if seating chart is used)
 */
export interface OrderRequest {
	orderItem: OrderItemRequest[]
	format: TicketFormatType
	holdToken?: string
	orderContact?: OrderContactRequest
}

/**
 * Single order item inside the order
 *
 * @param quantity Number of tickets inside the order item
 * @param ticketConfigId Id of the ticket configuration
 * @param timeslotId Id of the timeslot where the ticket is reserved
 * @param sectorId Id of the sector where the ticket is reserved
 * @param ticketDiscount Array of ticket discount IDs applied to the order item
 * @param selectedSeats Array of seat labels generated on Seats.io (if seating chart is used)
 */
export interface OrderItemRequest {
	quantity: number
	ticketConfigId: number
	timeslotId?: number
	sectorId?: number
	ticketDiscount?: number[]
	selectedSeats?: string[]
}

export interface OrderContactRequest {
	firstName: string
	lastName: string
	email: string
	billingEmail: string
	phone?: string
	street1?: string
	street2?: string
	city?: string
	zip?: string
	state?: string
	country?: string
	vatNumber?: string
	businessName?: string
}

export interface OrderItem {
	id: number
	price: number
	ticket: Ticket[]
}

export interface Order {
	id: number
	ownerId: string
	ownerType: string
	paymentId?: string
	format: string
	status?: OrderStatus
	total?: number
	refundedAmount?: number
	paymentCreatedAt?: Date
	createdAt: Date
	currency?: string
	holdToken?: string
	orderItem?: OrderItem[]
	orderContact?: OrderContact
}

export interface OrderContact extends OrderContactRequest {
	id: number
}

export interface OrderGet extends IdParam {
	with?: OrderAttribute
}

export enum OrderStatus {
	/**
	 * Initial order state
	 */
	Draft = 'draft',
	/**
	 * The state of the payment after a payment is associated to it
	 */
	PaymentProcessing = 'payment_processing',
	/**
	 * The state of the order after the payment wasn't made in the payment window
	 * or if the payment has timed out
	 * or if the payment has been manually canceled
	 * This is an end state
	 */
	Canceled = 'payment_failed',
	/**
	 * State after a successful payment confirmation
	 */
	Paid = 'paid',

	/**
	 * State when some tickets were refunded, but not all
	 * The only further state is `refunded`
	 */
	PartiallyRefunded = 'partially_refunded',

	/**
	 * State of order after its payment is refunded
	 * Should release the associated tickets
	 * This is an end state
	 */
	Refunded = 'refunded',
}

export interface OrderListQuery extends PagingQuery {
	organizer_id?: string
	include_not_owned?: boolean
	id?: number
	contact_email?: string
	event_id?: number
	sort_by?: string
	with?: OrderAttribute
}

export interface RefundOrderBody {
	ticketIds?: number[]
}
