import { SYSTEM } from "../config/system.mjs"

/** Schéma partagé pour les bonus/malus par domaine (utilisé dans anomaly/aspect/attribute). */
function skillScoresSchema() {
  const fields = foundry.data.fields
  const reqInt = { required: true, nullable: false, integer: true }
  const scoreField = () => new fields.SchemaField({
    bonus: new fields.NumberField({ ...reqInt, initial: 0 }),
    malus: new fields.NumberField({ ...reqInt, initial: 0 }),
  })

  const statGroup = (statId) => {
    const skills = SYSTEM.SKILLS[statId]
    const schema = {}
    for (const key of Object.keys(skills)) {
      schema[key] = scoreField()
    }
    return new fields.SchemaField(schema)
  }

  return new fields.SchemaField({
    ame:    statGroup("ame"),
    corps:  statGroup("corps"),
    coeur:  statGroup("coeur"),
    esprit: statGroup("esprit"),
  })
}

export class CelestopolAnomaly extends foundry.abstract.TypeDataModel {
  static defineSchema() {
    const fields = foundry.data.fields
    const reqInt = { required: true, nullable: false, integer: true }
    return {
      subtype:       new fields.StringField({ required: true, nullable: false, initial: "none",
                       choices: Object.keys(SYSTEM.ANOMALY_TYPES) }),
      level:         new fields.NumberField({ ...reqInt, initial: 2, min: 1, max: 4 }),
      usesRemaining: new fields.NumberField({ ...reqInt, initial: 2, min: 0, max: 4 }),
      technique:     new fields.HTMLField({ required: true, textSearch: true }),
      narratif:      new fields.HTMLField({ required: true, textSearch: true }),
      exemples:      new fields.HTMLField({ required: true, textSearch: true }),
    }
  }
}

export class CelestopolAspect extends foundry.abstract.TypeDataModel {
  static defineSchema() {
    const fields = foundry.data.fields
    const reqInt = { required: true, nullable: false, integer: true }
    return {
      value:       new fields.NumberField({ ...reqInt, initial: 0, min: 0, max: 8 }),
      scores:      skillScoresSchema(),
      description: new fields.HTMLField({ required: true, textSearch: true }),
      technique:   new fields.HTMLField({ required: true, textSearch: true }),
      narratif:    new fields.HTMLField({ required: true, textSearch: true }),
      notes:       new fields.HTMLField({ required: true, textSearch: true }),
    }
  }
}

export class CelestopolAttribute extends foundry.abstract.TypeDataModel {
  static defineSchema() {
    const fields = foundry.data.fields
    const reqInt = { required: true, nullable: false, integer: true }
    return {
      value:       new fields.NumberField({ ...reqInt, initial: 0, min: 0, max: 8 }),
      scores:      skillScoresSchema(),
      description: new fields.HTMLField({ required: true, textSearch: true }),
      technique:   new fields.HTMLField({ required: true, textSearch: true }),
      narratif:    new fields.HTMLField({ required: true, textSearch: true }),
      notes:       new fields.HTMLField({ required: true, textSearch: true }),
    }
  }
}

export class CelestopolEquipment extends foundry.abstract.TypeDataModel {
  static defineSchema() {
    const fields = foundry.data.fields
    const reqInt = { required: true, nullable: false, integer: true }
    return {
      subtype:    new fields.StringField({ required: true, nullable: false, initial: "autre",
                    choices: Object.keys(SYSTEM.EQUIPMENT_TYPES) }),
      quantity:   new fields.NumberField({ ...reqInt, initial: 1, min: 0 }),
      weight:     new fields.NumberField({ required: true, nullable: false, initial: 0, min: 0 }),
      damage:     new fields.StringField({ required: true, nullable: false, initial: "" }),
      range:      new fields.StringField({ required: true, nullable: false, initial: "" }),
      speed:      new fields.StringField({ required: true, nullable: false, initial: "" }),
      protection: new fields.StringField({ required: true, nullable: false, initial: "" }),
      crew:       new fields.StringField({ required: true, nullable: false, initial: "" }),
      description:new fields.HTMLField({ required: true, textSearch: true }),
      notes:      new fields.HTMLField({ required: true, textSearch: true }),
    }
  }
}
