import { z } from "zod";
import {
  numberFromForm,
  nonNegativeNumberFromForm,
  positiveNumberFromForm,
  intIdFromForm,
  nullableIntIdFromForm,
  booleanFromForm,
} from "./common";

const OrderItemSchema = z.object({
  description: z.string().max(8000).nullish(),
  item_description: z.string().max(8000).nullish(),
  quantity: positiveNumberFromForm.default(1),
  unit: z.string().max(255).nullish(),
  unit_price: numberFromForm.default(0),
  is_included_in_total: booleanFromForm.optional().default(true),
  position: nonNegativeNumberFromForm.optional(),
});

const OrderSectionSchema = z.object({
  title: z.string().max(255).nullish(),
  title_cz: z.string().max(255).nullish(),
  content: z.string().max(8000).nullish(),
  position: nonNegativeNumberFromForm.optional(),
});

export const CreateOrderFromQuotationSchema = z.object({
  quotationId: intIdFromForm,
  customerOrderNumber: z.string().max(255).optional().default(""),
});

export const CreateOrderSchema = z.object({
  order_number: z.string().max(255).nullish(),
  customer_order_number: z.string().max(255).nullish(),
  quotation_id: nullableIntIdFromForm.nullish(),
  customer_id: nullableIntIdFromForm.nullish(),
  status: z
    .enum(["prijata", "v_realizaci", "dokoncena", "zrusena"])
    .optional()
    .default("prijata"),
  currency: z.string().max(20).optional().default("CZK"),
  language: z.string().max(20).optional().default("cs"),
  exchange_rate: positiveNumberFromForm.optional().default(1.0),
  scope_title: z.string().max(255).nullish(),
  scope_description: z.string().max(8000).nullish(),
  notes: z.string().max(8000).nullish(),
  items: z.array(OrderItemSchema).optional(),
  sections: z.array(OrderSectionSchema).optional(),
  create_project: booleanFromForm.optional().default(true),
});

export const UpdateOrderSchema = z.object({
  customer_order_number: z.string().max(255).nullish(),
  status: z.enum(["prijata", "v_realizaci", "dokoncena", "zrusena"]).optional(),
  currency: z.string().max(20).optional(),
  language: z.string().max(20).optional(),
  scope_title: z.string().max(255).nullish(),
  scope_description: z.string().max(8000).nullish(),
  notes: z.string().max(8000).nullish(),
  customer_id: nullableIntIdFromForm.optional(),
  items: z.array(OrderItemSchema).optional(),
  sections: z.array(OrderSectionSchema).optional(),
});

export type CreateOrderFromQuotationInput = z.infer<
  typeof CreateOrderFromQuotationSchema
>;
export type CreateOrderInput = z.infer<typeof CreateOrderSchema>;
export type UpdateOrderInput = z.infer<typeof UpdateOrderSchema>;
