import Joi from 'joi';

import { generateJoiValidation } from '@/shared/validations/generateJoiValidation';
import { CustomerPayment } from '@/modules/customer/payment/payment.model';
import { objectId } from '@/shared/validations/custom.validation';
import { PaymentMethod, PaymentStatus } from '@/modules/customer/payment/payment.helper';

const paymentStageSchema = Joi.object()
  .keys({
    label: Joi.string().trim().required(),
    dueDate: Joi.date().optional().allow(null),
    dueAmount: Joi.number().min(0).optional(),
    paid: Joi.number().min(0).optional(),
    lastPaidAt: Joi.date().optional().allow(null),
    bankAccountId: Joi.string().custom(objectId).optional().allow(null),
    status: Joi.string()
      .valid(...Object.values(PaymentStatus))
      .optional(),
    method: Joi.string()
      .valid(...Object.values(PaymentMethod))
      .optional(),
  })
  .unknown(true);

export const createPayment = () => ({
  body: generateJoiValidation(CustomerPayment.schema),
});

/** PATCH /customers/:id/payment — body matches upsertPaymentTimeline (timeline required). */
export const upsertCustomerPaymentTimeline = () => ({
  params: Joi.object().keys({
    id: Joi.string().custom(objectId).required(),
  }),
  body: Joi.object()
    .keys({
      timeline: Joi.array().items(paymentStageSchema).required(),
      totalAmount: Joi.number().min(0).optional(),
      paidAmount: Joi.number().min(0).optional(),
    })
    .required(),
});

export const sendPaymentReminder = () => ({
  body: Joi.object().keys({
    stageId: Joi.string().custom(objectId).required(),
  }),
});

export const addPaymentEntry = () => ({
  params: Joi.object().keys({
    id: Joi.string().custom(objectId).required(),
    stageId: Joi.string().custom(objectId).required(),
  }),
  body: Joi.object().keys({
    amount: Joi.number().min(0).required(),
    receivedAt: Joi.date().optional(),
    bankAccountId: Joi.string().custom(objectId).optional(),
    method: Joi.string().optional(),
    note: Joi.string().allow('').optional(),
  }),
});

export const updatePaymentEntry = () => ({
  params: Joi.object().keys({
    id: Joi.string().custom(objectId).required(),
    stageId: Joi.string().custom(objectId).required(),
    entryId: Joi.string().custom(objectId).required(),
  }),
  body: Joi.object()
    .keys({
      amount: Joi.number().min(0).optional(),
      receivedAt: Joi.date().optional(),
      bankAccountId: Joi.string().custom(objectId).optional().allow(null, ''),
      method: Joi.string()
        .valid(...Object.values(PaymentMethod))
        .optional(),
      note: Joi.string().allow('').optional(),
    }),
});

export const deletePaymentEntry = () => ({
  params: Joi.object().keys({
    id: Joi.string().custom(objectId).required(),
    stageId: Joi.string().custom(objectId).required(),
    entryId: Joi.string().custom(objectId).required(),
  }),
});

export const updatePayment = () => ({
  query: Joi.object().keys({
    id: Joi.string().custom(objectId).required(),
  }),
  body: generateJoiValidation(CustomerPayment.schema, true),
});

export const getPayments = {
  query: Joi.object().keys({
    name: Joi.string(),
    role: Joi.string(),
    sortBy: Joi.string(),
    projectBy: Joi.string(),
    limit: Joi.number().integer().min(1),
    page: Joi.number().integer().min(-1),
    populate: Joi.string(),
    status: Joi.string(),
    paymentType: Joi.string(),
    search: Joi.string(),
    state: Joi.string(),
    company: Joi.string(),
    createdBy: Joi.string(),
  }),
};

export const getPaymentById = {
  params: Joi.object().keys({
    id: Joi.string().custom(objectId),
    populate: Joi.string(),
  }),
};

export const deletePaymentById = {
  params: Joi.object().keys({
    id: Joi.string().custom(objectId),
  }),
};
