{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://altheia.local/schemas/altheia-brand-pack-1.1.schema.json",
  "title": "ALTHEIA Brand Pack 1.1",
  "description": "Personalización versionada de una marca vinculada a la identidad semántica, de medición y de asignación de un Sector Pack 1.1 inmutable.",
  "type": "object",
  "additionalProperties": false,
  "required": ["schema_version", "pack_version", "status", "sector_reference", "dimension_governance", "brand", "offer_configuration", "channel_configuration", "relationship_configuration", "generation_rules", "versioning", "provenance", "quality_gate"],
  "properties": {
    "schema_version": {"const": "altheia_brand_pack_1.1"},
    "pack_version": {"type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$"},
    "status": {"enum": ["draft", "review", "approved", "deprecated", "retired"]},
    "sector_reference": {
      "type": "object",
      "additionalProperties": false,
      "required": ["sector_id", "sector_pack_id", "sector_pack_version", "sector_pack_schema", "dimension_registry_schema", "dimension_registry_version", "dimension_semantics_hash", "semantic_hash", "measurement_hash", "assignment_hash", "sector_pack_hash"],
      "properties": {
        "sector_id": {"$ref": "#/$defs/slug"},
        "sector_pack_id": {"type": "string", "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*@[0-9]+\\.[0-9]+\\.[0-9]+$"},
        "sector_pack_version": {"$ref": "#/$defs/semver"},
        "sector_pack_schema": {"const": "altheia_sector_pack_1.1"},
        "dimension_registry_schema": {"const": "altheia_dimension_registry_1.0"},
        "dimension_registry_version": {"$ref": "#/$defs/semver"},
        "dimension_semantics_hash": {"$ref": "#/$defs/hash"},
        "semantic_hash": {"$ref": "#/$defs/hash"},
        "measurement_hash": {"$ref": "#/$defs/hash"},
        "assignment_hash": {"$ref": "#/$defs/hash"},
        "sector_pack_hash": {"$ref": "#/$defs/hash"}
      }
    },
    "dimension_governance": {
      "type": "object",
      "description": "Prueba explícita de que la marca hereda las dimensiones y no redefine semántica, medición ni aplicabilidad.",
      "additionalProperties": false,
      "required": ["inheritance_mode", "identity_resolution", "semantic_overrides", "measurement_overrides", "assignment_overrides"],
      "properties": {
        "inheritance_mode": {"const": "sector_pack_locked"},
        "identity_resolution": {"const": "canonical_dimension_id"},
        "semantic_overrides": {"type": "array", "maxItems": 0},
        "measurement_overrides": {"type": "array", "maxItems": 0},
        "assignment_overrides": {"type": "array", "maxItems": 0}
      }
    },
    "brand": {
      "type": "object",
      "additionalProperties": false,
      "required": ["brand_id", "name", "markets", "languages"],
      "properties": {
        "brand_id": {"$ref": "#/$defs/slug"},
        "name": {"$ref": "#/$defs/nonEmpty"},
        "client_id": {"type": ["string", "null"], "minLength": 1},
        "client_name": {"type": ["string", "null"], "minLength": 1},
        "markets": {"type": "array", "minItems": 1, "uniqueItems": true, "items": {"type": "string", "pattern": "^[A-Z]{2}$"}},
        "languages": {"type": "array", "minItems": 1, "uniqueItems": true, "items": {"type": "string", "pattern": "^[a-z]{2,3}(?:-[A-Z]{2})?$"}}
      }
    },
    "offer_configuration": {
      "type": "object",
      "additionalProperties": false,
      "required": ["available_offers", "unavailable_offers", "offer_aliases"],
      "properties": {
        "available_offers": {"$ref": "#/$defs/stringSet"},
        "unavailable_offers": {"$ref": "#/$defs/stringList"},
        "offer_aliases": {"type": "object", "additionalProperties": {"$ref": "#/$defs/nonEmpty"}}
      }
    },
    "channel_configuration": {
      "type": "object",
      "additionalProperties": false,
      "required": ["available_channels", "primary_channels", "unavailable_channels"],
      "properties": {
        "available_channels": {"$ref": "#/$defs/stringSet"},
        "primary_channels": {"$ref": "#/$defs/stringSet"},
        "unavailable_channels": {"$ref": "#/$defs/stringList"}
      }
    },
    "relationship_configuration": {
      "type": "object",
      "additionalProperties": false,
      "required": ["statuses", "roles", "relationship_types", "competitor_brands", "rules"],
      "properties": {
        "statuses": {"$ref": "#/$defs/stringSet"},
        "roles": {"$ref": "#/$defs/stringSet"},
        "relationship_types": {"$ref": "#/$defs/stringSet"},
        "competitor_brands": {"$ref": "#/$defs/stringList"},
        "rules": {"type": "array", "items": {"type": "object", "required": ["rule_id", "description"], "properties": {"rule_id": {"$ref": "#/$defs/slug"}, "description": {"$ref": "#/$defs/nonEmpty"}}, "additionalProperties": false}}
      }
    },
    "generation_rules": {
      "type": "object",
      "additionalProperties": false,
      "required": ["default_profile_mix", "offer_assignment_mode", "channel_assignment_mode"],
      "properties": {
        "default_profile_mix": {"enum": ["both", "brand_only", "non_brand_only", "unbanked_only"]},
        "offer_assignment_mode": {"enum": ["subset_only", "weighted_subset"]},
        "channel_assignment_mode": {"enum": ["subset_only", "weighted_subset"]},
        "approval_mode": {"enum": ["production", "demonstration"]},
        "notes": {"type": "string"}
      }
    },
    "versioning": {
      "type": "object",
      "additionalProperties": false,
      "required": ["change_type", "based_on_brand_pack_id", "based_on_version", "changelog"],
      "properties": {
        "change_type": {"enum": ["initial", "patch", "minor", "major"]},
        "based_on_brand_pack_id": {"type": ["string", "null"]},
        "based_on_version": {"anyOf": [{"$ref": "#/$defs/semver"}, {"type": "null"}]},
        "changelog": {"$ref": "#/$defs/nonEmpty"}
      }
    },
    "provenance": {
      "type": "object",
      "additionalProperties": false,
      "required": ["created_at", "created_by", "sources", "assumptions"],
      "properties": {
        "created_at": {"type": "string", "format": "date-time"},
        "created_by": {"$ref": "#/$defs/nonEmpty"},
        "approved_at": {"type": ["string", "null"], "format": "date-time"},
        "approved_by": {"type": ["string", "null"]},
        "sources": {"type": "array", "items": {"type": "string"}},
        "assumptions": {"type": "array", "items": {"type": "string"}}
      }
    },
    "quality_gate": {
      "type": "object",
      "additionalProperties": false,
      "required": ["status", "validated_at", "checks"],
      "properties": {
        "status": {"enum": ["pending", "passed", "failed"]},
        "validated_at": {"type": ["string", "null"], "format": "date-time"},
        "checks": {"type": "array", "items": {"type": "object", "required": ["code", "status", "message"], "properties": {"code": {"$ref": "#/$defs/nonEmpty"}, "status": {"enum": ["passed", "failed", "warning"]}, "message": {"$ref": "#/$defs/nonEmpty"}}, "additionalProperties": false}}
      }
    }
  },
  "$defs": {
    "nonEmpty": {"type": "string", "minLength": 1},
    "slug": {"type": "string", "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"},
    "semver": {"type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$"},
    "hash": {"type": "string", "pattern": "^fnv1a-[a-f0-9]{8}$"},
    "stringSet": {"type": "array", "minItems": 1, "uniqueItems": true, "items": {"$ref": "#/$defs/nonEmpty"}},
    "stringList": {"type": "array", "uniqueItems": true, "items": {"$ref": "#/$defs/nonEmpty"}}
  }
}
