import * as Yup from 'yup';
import { PRODUCT_FLAG_MAPPING } from '@/config/constant';

type ProductFormSchemaType = {
  name: string;
  brand: string;
  sku?: string;
  uom?: {
    value: number;
    label: string;
  } | null;
  uom_id: number;
  product_category?: {
    value: number;
    label: string;
  } | null;
  product_category_id: number;
  product_price: number | string;
  selling_price?: number | string;
  tax?: number | string;
  expiry_period?: number | string;
  suppliers: {
    supplier: {
      value: number;
      label: string;
    } | null;
    price: number;
  }[];
  flag: string;
  sub_flags?: string[];
};

export const ProductFormSchema: Yup.ObjectSchema<ProductFormSchemaType> =
  Yup.object({
    name: Yup.string().required('Nama wajib diisi!'),
    brand: Yup.string().required('Merek wajib diisi!'),
    sku: Yup.string(),

    uom: Yup.object({
      value: Yup.number()
        .min(1, 'Satuan wajib dipilih!')
        .required('Satuan wajib dipilih!'),
      label: Yup.string().required('Satuan wajib dipilih!'),
    }).nullable(),

    uom_id: Yup.number()
      .min(1, 'Satuan wajib dipilih!')
      .required('Satuan wajib dipilih!')
      .typeError('Satuan wajib dipilih!'),

    product_category: Yup.object({
      value: Yup.number()
        .min(1, 'Kategori produk wajib dipilih!')
        .required('Kategori produk wajib dipilih!'),
      label: Yup.string().required('Kategori produk wajib dipilih!'),
    }).nullable(),

    product_category_id: Yup.number()
      .min(1, 'Kategori produk wajib dipilih!')
      .required('Kategori produk wajib dipilih!')
      .typeError('Kategori produk wajib dipilih!'),

    product_price: Yup.number()
      .required('Harga produk wajib diisi!')
      .typeError('Harga produk wajib diisi!')
      .min(1, 'Harga produk tidak boleh kurang dari 1!'),

    selling_price: Yup.number()
      .typeError('Harga hanya boleh angka!')
      .min(1, 'Harga jual tidak boleh kurang dari 1!'),

    tax: Yup.number()
      .typeError('Pajak hanya boleh angka!')
      .min(0, 'Pajak tidak boleh kurang dari 0!')
      .max(100, 'Pajak tidak boleh lebih dari 100%!'),

    expiry_period: Yup.number()
      .typeError('Periode kadaluarsa hanya boleh angka!')
      .min(1, 'Periode kadaluarsa tidak boleh kurang dari 1 hari!'),

    suppliers: Yup.array()
      .of(
        Yup.object({
          supplier: Yup.object({
            value: Yup.number()
              .min(1, 'Supplier wajib dipilih!')
              .required('Supplier wajib dipilih!')
              .typeError('Supplier wajib dipilih!'),
            label: Yup.string().required('Supplier wajib dipilih!'),
          }).required('Supplier wajib dipilih!'),
          price: Yup.number()
            .min(1, 'Harga tidak boleh kurang dari 1!')
            .required('Harga wajib diisi!')
            .typeError('Harga wajib diisi!'),
        })
      )
      .required('Supplier wajib diisi!'),

    flag: Yup.string()
      .min(1, 'Flag wajib diisi!')
      .required('Flag wajib diisi!')
      .typeError('Flag wajib diisi!'),

    sub_flags: Yup.array()
      .of(Yup.string().required())
      .when('flag', {
        is: (flag: string) => {
          const mapping = PRODUCT_FLAG_MAPPING.options.find(
            (opt) => opt.flag.value === flag
          );
          return mapping?.allow_without_sub_flag === false;
        },
        then: (schema) =>
          schema
            .required('Sub flag wajib diisi!')
            .min(1, 'Sub flag wajib diisi!'),
        otherwise: (schema) => schema,
      }),
  });

export const UpdateProductFormSchema = ProductFormSchema;

export type ProductFormValues = Yup.InferType<typeof ProductFormSchema>;
