package com.pixelized.shared.lwa.model.characterSheet.factory

import com.pixelized.shared.lwa.model.characterSheet.CharacterSheet
import com.pixelized.shared.lwa.model.characterSheet.CharacterSheetJsonV1
import com.pixelized.shared.lwa.usecase.CharacterSheetUseCase

class CharacterSheetJsonV1Factory(
    private val characterSheetUseCase: CharacterSheetUseCase,
) {
    fun convertFromJson(
        json: CharacterSheetJsonV1,
    ): CharacterSheet = characterSheetUseCase.run {
        CharacterSheet(
            id = json.id,
            name = json.name,
            job = json.job ?: "",
            portrait = json.portrait,
            thumbnail = json.thumbnail,
            externalLink = json.externalLink,
            level = json.level,
            shouldLevelUp = json.shouldLevelUp ?: false,
            characteristics = listOf(
                CharacterSheet.Characteristic(
                    id = CharacterSheet.CharacteristicId.STR,
                    label = "Force",
                    description = "La Force représente essentiellement la puissance musculaire du personnage. Elle ne décrit pas nécessairement la masse musculaire brute, mais l’efficacité avec laquelle le personnage exerce ses muscles pour accomplir des actions physiques pénibles.\n\n- Bonus aux dégats\n- Réflexe\n- Athlétisme\n- Lancer\n- Saisie",
                    base = json.strength,
                    level = 0,
                ),
                CharacterSheet.Characteristic(
                    id = CharacterSheet.CharacteristicId.DEX,
                    label = "Dextérité",
                    description = "La Constitution est une mesure de la ténacité et de la résilience du personnage. Elle sert à résister aux maladies. Mais son aspect le plus important réside dans la détermination du nombre de dommages qu’un personnage peut supporter avant de succomber.\n\n- Point de vie maximum\n- Athlétisme\n- Acrobatie",
                    base = json.dexterity,
                    level = 0,
                ),
                CharacterSheet.Characteristic(
                    id = CharacterSheet.CharacteristicId.CON,
                    label = "Constitution",
                    description = "La Taille est une mesure de la masse du personnage. Elle ne représente pas forcément la taille en centimètres, mais une idée générale de sa masse physique. Un personnage à la TAI élevée peut être très grand et mince, ou petit et massif, ou de taille moyenne en surpoids.\n\n- Bonus aux dégats\n- Point de vie maximum\n- Saisie\n- Intimidation\n- Discrétion (impact négatif)",
                    base = json.constitution,
                    level = 0,
                ),
                CharacterSheet.Characteristic(
                    id = CharacterSheet.CharacteristicId.HEI,
                    label = "Taille",
                    description = "L’Intelligence représente la capacité de discernement du personnage. Elle ne mesure pas nécessairement la somme d’informations mémorisées, mais l’aptitude au raisonnement, l’acuité intellectuelle, la capacité à résoudre des problèmes et l’intuition.\n\n- Bonus d'apprentissage\n- Réflexe\n- Perception\n- Recherche\n- Empathie\n- Baratin\n- Premiers soins",
                    base = json.height,
                    level = 0,
                ),
                CharacterSheet.Characteristic(
                    id = CharacterSheet.CharacteristicId.INT,
                    label = "Intelligence",
                    description = "Le Pouvoir est une mesure presque intangible de la force de volonté, du dynamisme intérieur et de l’énergie spirituelle. Il représente également le potentiel magique du personnage.\n\n- Points de pouvoir maximum\n- Intimidation",
                    base = json.intelligence,
                    level = 0,
                ),
                CharacterSheet.Characteristic(
                    id = CharacterSheet.CharacteristicId.POW,
                    label = "Pouvoir",
                    description = "La Dextérité mesure la coordination œil-main, la vitesse physique et l’agilité générale. La DEX détermine à quelle vitesse un personnage peut agir en combat.\n\n- Initiative\n- Réflexe\n- Bagarre\n- Esquive\n- Lancer\n- Acrobatie\n- Discrétion\n- Escamotage\n- Premiers soins",
                    base = json.power,
                    level = 0,
                ),
                CharacterSheet.Characteristic(
                    id = CharacterSheet.CharacteristicId.CHA,
                    label = "Charisme",
                    description = "Il représente plusieurs aspects allant de la grâce à la beauté en passant par l’attraction que le personnage exerce sur les autres. Un personnage avec un CHA élevé se remarque dans une foule en raison d’une intangible combinaison de charme et de présence.\n\n- Empathie\n- Persuasion\n- Persuasion\n- Intimidation\n- Baratin\n- Marchandage\n- Discrétion",
                    base = json.charisma,
                    level = 0,
                ),
            ),
            damage = json.damage ?: 0,
            fatigue = json.fatigue ?: 0,
            diminished = json.diminished ?: 0,
            alterations = json.alterations ?: emptyList(),
            commonSkills = json.skills.map {
                CharacterSheet.Skill(
                    id = it.id,
                    label = it.label,
                    description = it.description,
                    base = it.base,
                    bonus = it.bonus,
                    level = it.level,
                    occupation = it.occupation,
                    used = it.used,
                )
            },
            specialSkills = json.occupations.map {
                CharacterSheet.Skill(
                    id = it.id,
                    label = it.label,
                    description = it.description,
                    base = it.base,
                    bonus = it.bonus,
                    level = it.level,
                    occupation = it.occupation,
                    used = it.used,
                )
            },
            magicSkills = json.magics.map {
                CharacterSheet.Skill(
                    id = it.id,
                    label = it.label,
                    description = it.description,
                    base = it.base,
                    bonus = it.bonus,
                    level = it.level,
                    occupation = it.occupation,
                    used = it.used,
                )
            },
            actions = json.rolls.map {
                CharacterSheet.Roll(
                    id = it.id,
                    label = it.label,
                    description = it.description,
                    canBeCritical = it.canBeCritical,
                    default = it.roll,
                    special = it.special,
                    critical = it.critical,
                )
            },
            tags = json.tag ?: emptyList(),
        )
    }
}