// 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 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 statusAddTypeSchema = z.object({
    $type: z.string(),
    PropertyType: z.string(),
    Value: z.number(),
    Name: z.string()
});

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

export const extraSchema = z.object({
    name: z.string(),
    desc: z.string(),
    param: z.array(z.number())
});

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

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(), z.string().nullable()),
    Voicelines: z.array(z.string())
});

export const skillTypeSchema = z.object({
    Id: z.number(),
    Name: z.string(),
    Desc: z.string().nullable(),
    SimpleDesc: 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(z.string(), 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.number()),
    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(statusAddTypeSchema)
});

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.unknown(),
    ChangeSkillTreeList: z.unknown(),
    Ranks: z.record(z.string(), rankTypeSchema),
    Skills: z.record(z.string(), skillTypeSchema),
    SkillTrees: z.record(z.string(), z.record(z.string(), skillTreePointSchema))
});

export const spriteSkillSchema = z.object({
    Name: z.string(),
    Desc: z.string().nullable(),
    SimpleDesc: z.string(),
    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(),
    Extra: z.record(z.string(), extraSchema),
    Level: z.record(z.string(), levelParamsSchema)
});

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(z.string(), spriteSkillSchema),
    Talent: z.record(z.string(), z.unknown())
});

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(z.string(), rankTypeSchema),
    Skills: z.record(z.string(), skillTypeSchema),
    SkillTrees: z.record(z.string(), z.record(z.string(), skillTreePointSchema)),
    Memosprite: memospriteSchema,
    Unique: z.record(z.string(), uniqueAbilitySchema),
    Stats: z.record(z.string(), statSchema),
    Relics: relicsSchema,
    Enhanced: z.record(z.string(), enhancedTypeSchema),
    RankIcon: z.array(z.string())
});
