// Generated by ts-to-zod
import { z } from "zod";

export const rankTypeSchema = z.object({
  Id: z.number(),
  Name: z.string(),
  Desc: z.string(),
  ParamList: z.array(z.number()),
});

export const uniqueAbilitySchema = z.object({
  Tag: z.string(),
  Name: z.string(),
  Desc: z.string(),
  Param: z.array(z.number()),
});

export const voiceActorsSchema = z.object({
  Chinese: z.string().nullable(),
  Japanese: z.string().nullable(),
  Korean: z.string().nullable(),
  English: z.string().nullable(),
});

export const levelParamsSchema = z.object({
  Level: z.number(),
  ParamList: z.array(z.number()),
});

export const itemConfigRowSchema = z.object({
  $type: z.string(),
  ItemID: z.number(),
  ItemNum: z.number(),
  Rarity: z.string(),
});

export const spriteSkillSchema = z.object({
  Name: z.string(),
  Desc: z.string().nullable(),
  Type: z.string().nullable(),
  Tag: z.string(),
  SPBase: z.number().nullable(),
  BPNeed: z.number(),
  BPAdd: z.number().nullable(),
  ShowStanceList: z.array(z.number()),
  SkillComboValueDelta: z.number().nullable(),
  Level: z.record(levelParamsSchema),
});

export const statSchema = z.object({
  AttackBase: z.number(),
  AttackAdd: z.number(),
  DefenceBase: z.number(),
  DefenceAdd: z.number(),
  HPBase: z.number(),
  HPAdd: z.number(),
  SpeedBase: z.number(),
  CriticalChance: z.number(),
  CriticalDamage: z.number(),
  BaseAggro: z.number(),
  Cost: z.array(itemConfigRowSchema),
});

export const relicRecommendPropertySchema = z.object({
  $type: z.string(),
  RelicType: z.string(),
  PropertyType: z.string(),
});

export const characterInfoSchema = z.object({
  Camp: z.string().nullable(),
  VA: voiceActorsSchema,
  Stories: z.record(z.string().nullable()),
  Voicelines: z.array(z.string()),
});

export const skillTypeSchema = z.object({
  Id: z.number(),
  Name: z.string(),
  Desc: z.string(),
  Type: z.string(),
  Tag: z.string(),
  SPBase: z.number().nullable(),
  BPNeed: z.number(),
  BPAdd: z.number(),
  ShowStanceList: z.array(z.number()),
  SkillComboValueDelta: z.number().nullable(),
  Level: z.record(levelParamsSchema),
});

export const skillTreePointSchema = z.object({
  Anchor: z.string(),
  AvatarPromotionLimit: z.number().nullable(),
  AvatarLevelLimit: z.number().nullable(),
  DefaultUnlock: z.boolean(),
  Icon: z.string(),
  LevelUpSkillID: z.array(z.number()),
  MaterialList: z.array(itemConfigRowSchema),
  MaxLevel: z.number(),
  ParamList: z.array(z.any()),
  PointID: z.number(),
  PointName: z.string().nullable(),
  PointDesc: z.string().nullable(),
  PointTriggerKey: z.number(),
  PointType: z.number(),
  PrePoint: z.array(z.string()),
  StatusAddList: z.array(z.any()),
});

export const memospriteSchema = z.object({
  Name: z.string(),
  Icon: z.string(),
  HPBase: z.string(),
  HPInherit: z.string(),
  HPSkill: z.number().nullable(),
  SpeedBase: z.string(),
  SpeedInherit: z.string(),
  SpeedSkill: z.number(),
  Aggro: z.number(),
  Skills: z.record(spriteSkillSchema),
  Talent: z.record(z.any()),
});

export const relicsSchema = z.object({
  AvatarID: z.number(),
  Set4IDList: z.array(z.number()),
  Set2IDList: z.array(z.number()),
  PropertyList3: z.array(z.string()),
  PropertyList4: z.array(z.string()),
  PropertyList5: z.array(z.string()),
  PropertyList6: z.array(z.string()),
  PropertyList: z.array(relicRecommendPropertySchema),
  SubAffixPropertyList: z.array(z.string()),
  ScoreRankList: z.array(z.number()),
});

export const enhancedTypeSchema = z.object({
  Descs: z.array(z.string()),
  ChangeRankList: z.any(),
  ChangeSkillTreeList: z.any(),
  Ranks: z.record(rankTypeSchema),
  Skills: z.record(skillTypeSchema),
  SkillTrees: z.record(z.record(skillTreePointSchema)),
});

export const characterDetailSchema = z.object({
  Name: z.string(),
  Desc: z.string(),
  CharaInfo: characterInfoSchema,
  Rarity: z.string(),
  AvatarVOTag: z.string(),
  SPNeed: z.number().nullable(),
  BaseType: z.string(),
  DamageType: z.string(),
  Ranks: z.record(rankTypeSchema),
  Skills: z.record(skillTypeSchema),
  SkillTrees: z.record(z.record(skillTreePointSchema)),
  Memosprite: memospriteSchema,
  Unique: z.record(uniqueAbilitySchema),
  Stats: z.record(statSchema),
  Relics: relicsSchema,
  Enhanced: z.record(enhancedTypeSchema),
});
