import * as z from 'zod';
import {
  uiTrainingTypeValues
} from '../constants/training-record-options';

const trainingTypeRequiredMessage = 'กรุณาเลือกประเภทการอบรม';
const submittedMinutesRequiredMessage = 'กรุณาระบุจำนวนชั่วโมงอบรม';
const submittedMinutesMoreThanZeroMessage = 'จำนวนชั่วโมงอบรมต้องมากกว่า 0 นาที';
const submittedMinutesMaxMessage = 'จำนวนชั่วโมงอบรมต้องไม่เกิน 30 ชั่วโมง';
const approvedMinutesRequiredMessage = 'กรุณาระบุจำนวนชั่วโมงที่อนุมัติ';
const approvedMinutesMoreThanZeroMessage = 'จำนวนชั่วโมงที่อนุมัติต้องมากกว่า 0 นาที';
const approvedMinutesMaxMessage = 'จำนวนชั่วโมงที่อนุมัติต้องไม่เกิน 30 ชั่วโมง';

export const trainingRecordSchema = z
  .object({
    employeeId: z.string().min(1, 'กรุณาเลือกพนักงาน'),
    useCustomCourse: z.boolean().optional(),
    courseId: z.number().int().positive().nullable().optional(),
    courseName: z.string().trim(),
    customCourseName: z.string().trim().optional(),
    trainingDate: z
      .string()
      .min(1, 'กรุณาเลือกวันที่อบรม')
      .refine((value) => !Number.isNaN(Date.parse(value)), 'วันที่อบรมไม่ถูกต้อง'),
    trainingType: z
      .string()
      .min(1, trainingTypeRequiredMessage)
      .refine(
        (value) =>
          uiTrainingTypeValues.includes(value as (typeof uiTrainingTypeValues)[number]),
        trainingTypeRequiredMessage
      ),
    submittedMinutes: z
      .number({ message: submittedMinutesRequiredMessage })
      .gt(0, submittedMinutesMoreThanZeroMessage)
      .max(1800, submittedMinutesMaxMessage),
    organizer: z.string().trim().optional(),
    note: z.string().trim().optional()
  })
  .superRefine((value, ctx) => {
    const hasCourseId = value.courseId !== null && value.courseId !== undefined;
    const customCourseName = value.customCourseName?.trim() ?? '';
    const useCustomCourse = value.useCustomCourse ?? false;

    if (!useCustomCourse && !hasCourseId) {
      ctx.addIssue({
        code: z.ZodIssueCode.custom,
        message: 'กรุณาเลือกหลักสูตร',
        path: ['courseId']
      });
    }

    if (useCustomCourse && !customCourseName) {
      ctx.addIssue({
        code: z.ZodIssueCode.custom,
        message: 'กรุณากรอกชื่อหลักสูตร',
        path: ['customCourseName']
      });
    }
  });

export type TrainingRecordFormValues = {
  employeeId: string;
  useCustomCourse?: boolean;
  courseId?: number | null;
  courseName: string;
  customCourseName?: string;
  trainingDate: string;
  trainingType: string;
  submittedMinutes: number | undefined;
  organizer?: string;
  note?: string;
};

export const trainingRecordReviewSchema = z.discriminatedUnion('status', [
  z.object({
    status: z.literal('approved'),
    category: z.enum(['K', 'S', 'A']),
    approvedMinutes: z
      .number({ message: approvedMinutesRequiredMessage })
      .gt(0, approvedMinutesMoreThanZeroMessage)
      .max(1800, approvedMinutesMaxMessage),
    reviewerNote: z.string().trim().optional(),
    rejectReason: z.string().optional()
  }),
  z.object({
    status: z.literal('needs_revision'),
    rejectReason: z.string().trim().min(1, 'กรุณาระบุเหตุผลที่ไม่อนุมัติ'),
    reviewerNote: z.string().trim().optional(),
    category: z.enum(['K', 'S', 'A']).optional(),
    approvedMinutes: z.number().optional()
  })
]);

export type TrainingRecordReviewFormValues =
  | {
      status: 'approved';
      category: 'K' | 'S' | 'A';
      approvedMinutes: number | undefined;
      reviewerNote?: string;
      rejectReason?: string;
    }
  | {
      status: 'needs_revision';
      rejectReason: string;
      reviewerNote?: string;
      category?: 'K' | 'S' | 'A';
      approvedMinutes?: number | undefined;
    };
