import {
  KeyValueOfStringAndStringSchema,
  DateRangeSchema,
} from '@isa/common/data-access';
import { z } from 'zod';
import { CRUDASchema } from './cruda.schema';
import { EnvironmentChannelSchema } from './environment-channel.schema';
import { GenderSchema } from './gender.schema';
import { LoyaltySchema } from './loyalty.schema';
import { OrderItemProcessingStatusValueSchema } from './order-item-processing-status-value.schema';
import { OrderTypeSchema } from './order-type.schema';
import { PaymentStatusSchema } from './payment-status.schema';
import { PaymentTypeSchema } from './payment-type.schema';
import { PriceSchema } from './price.schema';
import { ProductSchema } from './product.schema';
import { VATTypeSchema } from './vat-type.schema';

/**
 * Order Item List Item DTO schema
 * Bestellposten
 */
export const OrderItemListItemSchema = z.object({
  actions: z
    .array(KeyValueOfStringAndStringSchema)
    .describe('Mögliche Aktionen')
    .optional(),
  buyerNumber: z.string().describe('Auftraggeber-Nr').optional(),
  clientChannel: EnvironmentChannelSchema.describe('Bestellkanal').optional(),
  compartmentCode: z.string().describe('Abholfachnummer').optional(),
  compartmentInfo: z.string().describe('Abholfach-Zusatz').optional(),
  cruda: CRUDASchema.describe(
    'Can Create, Read, Update, Delete, Archive',
  ).optional(),
  currency: z.string().describe('Währung').optional(),
  department: z.string().describe('Abteilung').optional(),
  estimatedDelivery: DateRangeSchema.describe(
    'Voraussichtlicher Zustellzeitraum',
  ).optional(),
  estimatedShippingDate: z
    .string()
    .describe('Voraussichtliches Lieferdatum')
    .optional(),
  features: z
    .record(z.string(), z.string())
    .describe('Zusätzliche Markierungen')
    .optional(),
  firstName: z.string().describe('Vorname').optional(),
  gender: GenderSchema.describe('Anrede').optional(),
  isPrebooked: z
    .boolean()
    .describe('Bestellunposten wurde vorgemerkt')
    .optional(),
  label: z.string().describe('Label').optional(),
  labelId: z.number().describe('Label PK').optional(),
  lastName: z.string().describe('Nachname').optional(),
  loyalty: LoyaltySchema.describe('Loyalty').optional(),
  orderBranchId: z.number().describe('Bestellfiliale').optional(),
  orderDate: z.string().describe('Bestelldatum').optional(),
  orderId: z.number().describe('Bestellung ID').optional(),
  orderItemId: z.number().describe('Bestellposten ID').optional(),
  orderItemNumber: z.string().describe('Bestellpostennummer').optional(),
  orderItemPId: z.string().describe('Bestellposten PId').optional(),
  orderItemSubsetId: z
    .number()
    .describe('Bestellposten Teilmenge ID')
    .optional(),
  orderItemSubsetPId: z
    .string()
    .describe('Bestellposten Teilmenge PId')
    .optional(),
  orderItemSubsetUId: z
    .string()
    .describe('Bestellposten Teilmenge UId')
    .optional(),
  orderItemUId: z.string().describe('Bestellposten UId').optional(),
  orderNumber: z.string().describe('Bestellnummer').optional(),
  orderPId: z.string().describe('Bestellung PId').optional(),
  orderType: OrderTypeSchema.describe('Art der Bestellung').optional(),
  orderUId: z.string().describe('Bestellung UId').optional(),
  organisation: z.string().describe('Firma / Organisation').optional(),
  overallQuantity: z.number().describe('Menge gesamt').optional(),
  paymentProcessing: z.string().describe('Zahungsabwicklung').optional(),
  paymentStatus: PaymentStatusSchema.describe('Zahlungsstatus').optional(),
  paymentType: PaymentTypeSchema.describe('Zahlungsart').optional(),
  pickUpDeadline: z.string().describe('Abholfrist').optional(),
  price: z.number().describe('Preis').optional(),
  processingStatus:
    OrderItemProcessingStatusValueSchema.describe(
      'Bearbeitungsstatus',
    ).optional(),
  processingStatusDate: z
    .string()
    .describe('Bearbeitungsstatus wurde gesetzt am')
    .optional(),
  product: ProductSchema.describe('Artikel-/Produktdaten').optional(),
  quantity: z.number().describe('Menge').optional(),
  readyForPickUp: z.string().describe('Im Abholfach seit').optional(),
  retailPrice: PriceSchema.describe('VK').optional(),
  shopName: z.string().describe('Bestellfiliale').optional(),
  specialComment: z.string().describe('Bemerkung zum Bestellposten').optional(),
  ssc: z.string().describe('Verfügbarkeitsstatus-Code').optional(),
  sscText: z.string().describe('Verfügbarkeitsstatus-Beschreibung').optional(),
  supplier: z.string().describe('Lieferant').optional(),
  supplierId: z.number().describe('Lieferant PK').optional(),
  targetBranch: z.string().describe('Zielfiliale').optional(),
  targetBranchId: z.number().describe('Zielfiliale PK').optional(),
  title: z.string().describe('Titel').optional(),
  vatType: VATTypeSchema.describe('Mehrwertsteuer-Art').optional(),
});

export type OrderItemListItem = z.infer<typeof OrderItemListItemSchema>;
