import { z } from 'zod';
import { DisabledStatus } from '@/share/types';

// 地点创建Schema
export const createLocationSchema = z.object({
  name: z.string().min(1, '地点名称不能为空').max(255, '地点名称不能超过255个字符'),
  provinceId: z.number().int().positive('省份ID必须为正整数'),
  cityId: z.number().int().positive('城市ID必须为正整数'),
  districtId: z.number().int().positive('区县ID必须为正整数'),
  address: z.string().min(1, '详细地址不能为空').max(500, '详细地址不能超过500个字符'),
  latitude: z.coerce.number().min(-90, '纬度必须在-90到90之间').max(90, '纬度必须在-90到90之间').nullable().optional(),
  longitude: z.coerce.number().min(-180, '经度必须在-180到180之间').max(180, '经度必须在-180到180之间').nullable().optional(),
  isDisabled: z.nativeEnum(DisabledStatus).default(DisabledStatus.ENABLED),
});

// 地点更新Schema
export const updateLocationSchema = z.object({
  name: z.string().min(1, '地点名称不能为空').max(255, '地点名称不能超过255个字符').optional(),
  provinceId: z.number().int().positive('省份ID必须为正整数').optional(),
  cityId: z.number().int().positive('城市ID必须为正整数').optional(),
  districtId: z.number().int().positive('区县ID必须为正整数').optional(),
  address: z.string().min(1, '详细地址不能为空').max(500, '详细地址不能超过500个字符').optional(),
  latitude: z.coerce.number().min(-90, '纬度必须在-90到90之间').max(90, '纬度必须在-90到90之间').nullable().optional(),
  longitude: z.coerce.number().min(-180, '经度必须在-180到180之间').max(180, '经度必须在-180到180之间').nullable().optional(),
  isDisabled: z.nativeEnum(DisabledStatus).optional(),
});

// 地点获取Schema
export const getLocationSchema = z.object({
  id: z.number().int().positive('ID必须为正整数'),
  name: z.string().min(1, '地点名称不能为空').max(255, '地点名称不能超过255个字符'),
  provinceId: z.number().int().positive('省份ID必须为正整数'),
  cityId: z.number().int().positive('城市ID必须为正整数'),
  districtId: z.number().int().positive('区县ID必须为正整数'),
  address: z.string().min(1, '详细地址不能为空').max(500, '详细地址不能超过500个字符'),
  latitude: z.coerce.number().min(-90, '纬度必须在-90到90之间').max(90, '纬度必须在-90到90之间').nullable(),
  longitude: z.coerce.number().min(-180, '经度必须在-180到180之间').max(180, '经度必须在-180到180之间').nullable(),
  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 listLocationsSchema = z.object({
  keyword: z.string().optional(),
  provinceId: z.coerce.number().int().positive().optional(),
  cityId: z.coerce.number().int().positive().optional(),
  districtId: z.coerce.number().int().positive().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', 'provinceId', 'cityId', 'districtId', 'createdAt']).default('createdAt'),
  sortOrder: z.enum(['ASC', 'DESC']).default('DESC'),
});

// 地点列表返回Schema
export const locationListResponseSchema = z.object({
  id: z.number().int().positive('ID必须为正整数'),
  name: z.string().min(1, '地点名称不能为空').max(255, '地点名称不能超过255个字符'),
  provinceId: z.number().int().positive('省份ID必须为正整数'),
  cityId: z.number().int().positive('城市ID必须为正整数'),
  districtId: z.number().int().positive('区县ID必须为正整数'),
  address: z.string().min(1, '详细地址不能为空').max(500, '详细地址不能超过500个字符'),
  latitude: z.coerce.number().min(-90, '纬度必须在-90到90之间').max(90, '纬度必须在-90到90之间').nullable(),
  longitude: z.coerce.number().min(-180, '经度必须在-180到180之间').max(180, '经度必须在-180到180之间').nullable(),
  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(),
  // 关联的省市区信息
  province: z.object({
    id: z.number().int().positive('省份ID必须为正整数'),
    name: z.string().min(1, '省份名称不能为空').max(100, '省份名称不能超过100个字符'),
    level: z.coerce.number().int().min(1).max(1, '省份层级必须为1'),
    code: z.string().min(1, '行政区划代码不能为空').max(20, '行政区划代码不能超过20个字符'),
  }).nullable(),
  city: z.object({
    id: z.number().int().positive('城市ID必须为正整数'),
    name: z.string().min(1, '城市名称不能为空').max(100, '城市名称不能超过100个字符'),
    level: z.coerce.number().int().min(2).max(2, '城市层级必须为2'),
    code: z.string().min(1, '行政区划代码不能为空').max(20, '行政区划代码不能超过20个字符'),
  }).nullable(),
  district: z.object({
    id: z.number().int().positive('区县ID必须为正整数'),
    name: z.string().min(1, '区县名称不能为空').max(100, '区县名称不能超过100个字符'),
    level: z.coerce.number().int().min(2).max(3, '区县层级必须在2-3之间'),
    code: z.string().min(1, '行政区划代码不能为空').max(20, '行政区划代码不能超过20个字符'),
  }).nullable(),
});

// 地点删除Schema
export const deleteLocationSchema = z.object({
  id: z.number().int().positive('ID必须为正整数'),
});

// 地点启用/禁用Schema
export const toggleLocationStatusSchema = z.object({
  id: z.number().int().positive('ID必须为正整数'),
  isDisabled: z.nativeEnum(DisabledStatus),
});

// 地点搜索Schema
export const searchLocationsSchema = z.object({
  keyword: z.string().optional(),
  provinceId: z.coerce.number().int().positive().optional(),
  cityId: z.coerce.number().int().positive().optional(),
  districtId: z.coerce.number().int().positive().optional(),
  limit: z.coerce.number().int().min(1).max(50).default(20),
});

// 导出类型
export type CreateLocationInput = z.infer<typeof createLocationSchema>;
export type UpdateLocationInput = z.infer<typeof updateLocationSchema>;
export type GetLocationInput = z.infer<typeof getLocationSchema>;
export type ListLocationsInput = z.infer<typeof listLocationsSchema>;
export type DeleteLocationInput = z.infer<typeof deleteLocationSchema>;
export type ToggleLocationStatusInput = z.infer<typeof toggleLocationStatusSchema>;
export type SearchLocationsInput = z.infer<typeof searchLocationsSchema>;