{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "reversa-pricing-profile-v1.2",
  "title": "Reversa Pricing Profile",
  "description": "Perfil de cobrança gerado pelo agente reversa-pricing-profile, consumido por size, estimate e product.",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "schema_version",
    "created_at",
    "mode",
    "country",
    "currency",
    "seniority",
    "hourly_rate",
    "hourly_rate_mode",
    "margin_percent",
    "tax_regime",
    "tax_factor",
    "tax_factor_kind",
    "tax_factor_source",
    "includes_vat",
    "vat_pass_through_warning",
    "tax_regime_confidence",
    "pricing_models",
    "field_origins"
  ],
  "properties": {
    "schema_version": {
      "type": "string",
      "const": "1.2",
      "description": "Versão do schema. v1 = 1.0, v1.1 adicionou campos tributários, v1.2 adicionou modo, região e origem dos campos."
    },
    "created_at": {
      "type": "string",
      "format": "date-time",
      "description": "Timestamp ISO 8601 UTC da criação ou da última regeneração do profile."
    },
    "mode": {
      "type": "string",
      "enum": ["experiente", "leigo"],
      "description": "experiente = o usuário informou os valores (sei informar); leigo = a taxa hora foi pesquisada e os demais campos receberam padrão (pesquisar)."
    },
    "country": {
      "type": "string",
      "pattern": "^[A-Z]{2}$",
      "description": "Código ISO 3166-1 alpha-2 do país de operação."
    },
    "currency": {
      "type": "string",
      "pattern": "^[A-Z]{3}$",
      "description": "Código ISO 4217 da moeda local."
    },
    "region": {
      "type": ["object", "null"],
      "additionalProperties": false,
      "properties": {
        "city": {
          "type": ["string", "null"],
          "description": "Cidade de atuação informada pelo usuário em modo leigo."
        },
        "state": {
          "type": ["string", "null"],
          "description": "Estado ou província de atuação informada pelo usuário em modo leigo."
        }
      },
      "description": "Região usada pela pesquisa de taxa hora. null em modo experiente ou quando o usuário pulou."
    },
    "seniority": {
      "type": "string",
      "enum": ["junior", "mid", "senior", "staff_lead", "principal"]
    },
    "hourly_rate": {
      "type": "number",
      "exclusiveMinimum": 0,
      "description": "Taxa hora líquida na moeda local."
    },
    "hourly_rate_mode": {
      "type": "string",
      "enum": ["direto", "derivado", "pesquisado"],
      "description": "direto = usuário informou o valor; derivado = calculado a partir de monthly_target_income e billable_hours_per_month; pesquisado = escolhido dentro da faixa do reversa-pricing-research e confirmado pelo usuário."
    },
    "monthly_target_income": {
      "type": ["number", "null"],
      "exclusiveMinimum": 0,
      "description": "Renda mensal líquida desejada na moeda local. Obrigatório quando hourly_rate_mode = derivado, null caso contrário."
    },
    "billable_hours_per_month": {
      "type": ["number", "null"],
      "minimum": 1,
      "maximum": 720,
      "description": "Horas faturáveis estimadas por mês. Obrigatório quando hourly_rate_mode = derivado, null caso contrário."
    },
    "margin_percent": {
      "type": "number",
      "minimum": 0,
      "maximum": 200,
      "description": "Markup de projeto sobre custo direto, em percentual. O nome historico do campo permanece margin_percent por compatibilidade."
    },
    "tax_regime": {
      "type": "string",
      "minLength": 1,
      "description": "Chave canônica do regime tributário documentado em references/tax-regimes.md, ou 'outro'."
    },
    "tax_factor": {
      "type": "number",
      "minimum": 0,
      "maximum": 1,
      "description": "Fator de imposto aproximado associado ao regime. Aplicado pelo Pricer sobre o custo direto."
    },
    "tax_factor_kind": {
      "type": "string",
      "enum": ["effective_reserve_estimate", "statutory_proxy", "not_computed"],
      "description": "Tipo do fator: reserva efetiva aproximada, proxy legal simplificada ou imposto nao computado."
    },
    "tax_factor_source": {
      "type": "string",
      "minLength": 1,
      "description": "Fonte publica ou catalogo interno que justifica o fator aproximado."
    },
    "includes_vat": {
      "type": "boolean",
      "description": "Indica se o fator combina imposto sobre renda/contribuicao com VAT/IVA/ISS destacado."
    },
    "vat_pass_through_warning": {
      "type": "boolean",
      "description": "Indica se o estimate deve avisar que parte do imposto pode ser repassada ao cliente e nao reduzir margem."
    },
    "tax_regime_confidence": {
      "type": "string",
      "enum": ["high", "low"],
      "description": "high = usuário escolheu explicitamente; low = sugestão fallback ou 'outro'."
    },
    "pricing_models": {
      "type": "array",
      "minItems": 1,
      "uniqueItems": true,
      "items": {
        "type": "string",
        "enum": [
          "escopo_fechado",
          "time_and_materials",
          "sprint",
          "retainer",
          "valor_fixo_por_entrega"
        ]
      }
    },
    "client_profile": {
      "type": "array",
      "uniqueItems": true,
      "items": {
        "type": "string",
        "enum": [
          "microempresa",
          "pequena_empresa",
          "media_empresa",
          "enterprise",
          "governo",
          "cliente_internacional"
        ]
      },
      "description": "Pode ser vazio quando o usuário escolhe pular essa pergunta ou em modo leigo."
    },
    "billing_currency": {
      "type": ["string", "null"],
      "pattern": "^[A-Z]{3}$",
      "description": "Moeda em que o usuário cobra do cliente quando diferente de currency. null quando cobra na moeda local."
    },
    "exchange_rate_to_local": {
      "type": ["number", "null"],
      "exclusiveMinimum": 0,
      "description": "Câmbio manual: quantas unidades de currency valem 1 unidade de billing_currency. null quando não cobra em moeda estrangeira."
    },
    "research_ref": {
      "type": ["string", "null"],
      "description": "Caminho de _pricing/research/hourly_rate.json quando a taxa hora foi pesquisada. null caso contrário."
    },
    "field_origins": {
      "type": "object",
      "additionalProperties": false,
      "required": ["hourly_rate", "margin_percent", "tax_regime", "pricing_models"],
      "description": "Origem de cada campo sensível do profile: digitado pelo usuário, pesquisado pelo research ou padrão do agente.",
      "properties": {
        "hourly_rate": { "$ref": "#/$defs/field_origin" },
        "margin_percent": { "$ref": "#/$defs/field_origin" },
        "tax_regime": { "$ref": "#/$defs/field_origin" },
        "pricing_models": { "$ref": "#/$defs/field_origin" }
      }
    }
  },
  "$defs": {
    "field_origin": {
      "type": "object",
      "additionalProperties": false,
      "required": ["origin", "source", "researched_at"],
      "properties": {
        "origin": {
          "type": "string",
          "enum": ["digitado", "pesquisado", "padrao"],
          "description": "digitado = informado pelo usuário; pesquisado = vindo do reversa-pricing-research e confirmado; padrao = valor padrão do agente aceito sem alteração."
        },
        "source": {
          "type": ["string", "null"],
          "description": "Fonte do valor: caminho do research mais nomes das fontes, ou nome do padrão aplicado. null quando digitado."
        },
        "researched_at": {
          "type": ["string", "null"],
          "format": "date",
          "description": "Data de acesso da pesquisa (sources[0].accessed_at do research, AAAA-MM-DD). null quando não pesquisado."
        }
      }
    }
  },
  "allOf": [
    {
      "if": {
        "properties": {
          "hourly_rate_mode": { "const": "derivado" }
        }
      },
      "then": {
        "required": ["monthly_target_income", "billable_hours_per_month"]
      }
    }
  ]
}
