import { z } from 'zod';
import { DisabledStatus } from '@d8d/shared-types';
import { AreaLevel } from './area.entity.mt';

// 省市区创建Schema（多租户）
export const createAreaSchemaMt = z.object({
  tenantId: z.number().int().positive('租户ID必须为正整数'),
  parentId: z.number().int().min(0, '父级ID不能为负数').nullable().default(null),
  name: z.string().min(1, '区域名称不能为空').max(100, '区域名称不能超过100个字符'),
  level: z.nativeEnum(AreaLevel, {
    message: '层级必须是1(省/直辖市)、2(市)或3(区/县)'
  }),
  code: z.string().min(1, '行政区划代码不能为空').max(20, '行政区划代码不能超过20个字符'),
  isDisabled: z.nativeEnum(DisabledStatus).default(DisabledStatus.ENABLED),
}).refine((data) => {
  // 验证层级和父级ID的关系
  if (data.level === AreaLevel.PROVINCE && data.parentId !== null) {
    return false;
  }
  if (data.level !== AreaLevel.PROVINCE && data.parentId === null) {
    return false;
  }
  return true;
}, {
  message: '层级和父级ID关系不正确：省/直辖市(parentId=null)，市/区县(parentId>0)',
  path: ['parentId'],
});

// 省市区更新Schema（多租户）
export const updateAreaSchemaMt = z.object({
  tenantId: z.number().int().positive('租户ID必须为正整数').optional(),
  parentId: z.number().int().min(0, '父级ID不能为负数').nullable().optional(),
  name: z.string().min(1, '区域名称不能为空').max(100, '区域名称不能超过100个字符').optional(),
  level: z.nativeEnum(AreaLevel, {
    message: '层级必须是1(省/直辖市)、2(市)或3(区/县)'
  }).optional(),
  code: z.string().min(1, '行政区划代码不能为空').max(20, '行政区划代码不能超过20个字符').optional(),
  isDisabled: z.nativeEnum(DisabledStatus).optional(),
}).refine((data) => {
  // 验证层级和父级ID的关系
  // 只有当两个字段都有值且都不为undefined时才进行验证
  if (data.level !== undefined && data.parentId !== undefined) {
    if (data.level === AreaLevel.PROVINCE && data.parentId !== null) {
      return false;
    }
    if (data.level !== AreaLevel.PROVINCE && data.parentId === null) {
      return false;
    }
  }
  return true;
}, {
  message: '层级和父级ID关系不正确：省/直辖市(parentId=null)，市/区县(parentId>0)',
  path: ['parentId'],
});

// 省市区获取Schema（多租户）
export const getAreaSchemaMt = z.object({
  id: z.number().int().positive('ID必须为正整数'),
  tenantId: z.number().int().positive('租户ID必须为正整数'),
  parentId: z.number().int().min(0, '父级ID不能为负数').nullable(),
  name: z.string().min(1, '区域名称不能为空').max(100, '区域名称不能超过100个字符'),
  level: z.nativeEnum(AreaLevel, {
    message: '层级必须是1(省/直辖市)、2(市)或3(区/县)'
  }),
  code: z.string().min(1, '行政区划代码不能为空').max(20, '行政区划代码不能超过20个字符'),
  isDisabled: z.nativeEnum(DisabledStatus),
  isDeleted: z.number().int(),
  createdAt: z.coerce.date(),
  updatedAt: z.coerce.date(),
  createdBy: z.number().int().nullable(),
  updatedBy: z.number().int().nullable(),
});

// 省市区列表查询Schema（多租户）
export const listAreasSchemaMt = z.object({
  tenantId: z.number().int().positive('租户ID必须为正整数'),
  keyword: z.string().optional(),
  level: z.nativeEnum(AreaLevel).optional(),
  parentId: z.coerce.number().int().min(0).optional(),
  isDisabled: z.coerce.number().int().optional(),
  page: z.coerce.number().int().min(1).default(1),
  pageSize: z.coerce.number().int().min(1).max(100).default(20),
  sortBy: z.enum(['name', 'level', 'code', 'createdAt']).default('createdAt'),
  sortOrder: z.enum(['ASC', 'DESC']).default('DESC'),
});

// 省市区列表返回Schema（多租户）
export const areaListResponseSchemaMt = z.object({
  id: z.number().int().positive('ID必须为正整数'),
  tenantId: z.number().int().positive('租户ID必须为正整数'),
  parentId: z.coerce.number().int().min(0, '父级ID不能为负数').nullable(),
  name: z.string().min(1, '区域名称不能为空').max(100, '区域名称不能超过100个字符'),
  level: z.nativeEnum(AreaLevel, {
    message: '层级必须是1(省/直辖市)、2(市)或3(区/县)'
  }),
  code: z.string().min(1, '行政区划代码不能为空').max(20, '行政区划代码不能超过20个字符'),
  isDisabled: z.nativeEnum(DisabledStatus),
  isDeleted: z.number().int(),
  createdAt: z.coerce.date(),
  updatedAt: z.coerce.date(),
  createdBy: z.number().int().nullable(),
  updatedBy: z.number().int().nullable(),
});

// 省市区删除Schema（多租户）
export const deleteAreaSchemaMt = z.object({
  id: z.number().int().positive('ID必须为正整数'),
  tenantId: z.number().int().positive('租户ID必须为正整数'),
});

// 省市区启用/禁用Schema（多租户）
export const toggleAreaStatusSchemaMt = z.object({
  id: z.number().int().positive('ID必须为正整数'),
  tenantId: z.number().int().positive('租户ID必须为正整数'),
  isDisabled: z.nativeEnum(DisabledStatus),
});

// 省市区层级查询Schema（多租户）
export const getAreasByLevelSchemaMt = z.object({
  tenantId: z.number().int().positive('租户ID必须为正整数'),
  level: z.nativeEnum(AreaLevel, {
    message: '层级必须是1(省/直辖市)、2(市)或3(区/县)'
  }),
});

// 省市区子级查询Schema（多租户）
export const getChildAreasSchemaMt = z.object({
  tenantId: z.number().int().positive('租户ID必须为正整数'),
  parentId: z.number().int().positive('父级ID必须为正整数'),
});

// 省市区路径查询Schema（多租户）
export const getAreaPathSchemaMt = z.object({
  tenantId: z.number().int().positive('租户ID必须为正整数'),
  id: z.number().int().positive('区域ID必须为正整数'),
});

// 导出类型（多租户）
export type CreateAreaInputMt = z.infer<typeof createAreaSchemaMt>;
export type UpdateAreaInputMt = z.infer<typeof updateAreaSchemaMt>;
export type GetAreaInputMt = z.infer<typeof getAreaSchemaMt>;
export type ListAreasInputMt = z.infer<typeof listAreasSchemaMt>;
export type DeleteAreaInputMt = z.infer<typeof deleteAreaSchemaMt>;
export type ToggleAreaStatusInputMt = z.infer<typeof toggleAreaStatusSchemaMt>;
export type GetAreasByLevelInputMt = z.infer<typeof getAreasByLevelSchemaMt>;
export type GetChildAreasInputMt = z.infer<typeof getChildAreasSchemaMt>;
export type GetAreaPathInputMt = z.infer<typeof getAreaPathSchemaMt>;