-- Mart: Canonical school dimension — one row per active URN

-- int_ofsted_latest is only ref()'d inside a conditional block below (it may not
-- exist before the Ofsted pipeline first runs), so declare the dependency
-- explicitly for dbt's DAG.
-- depends_on: {{ ref('int_ofsted_latest') }}

with schools as (
    select * from {{ ref('stg_gias_establishments') }}
)

{% set ofsted_relation = adapter.get_relation(
    database=target.database,
    schema='intermediate',
    identifier='int_ofsted_latest'
) %}

select
    s.urn,
    s.local_authority_code * 1000 + s.establishment_number as laestab,
    s.school_name,
    -- Phase in GIAS code space (see seeds/gias_code_names.csv):
    -- 2 = Primary, 4 = Secondary, 7 = All-through, 0 = Not applicable.
    case
        -- 1. Trust GIAS phase when it's a real value (0 = the catch-all "Not Applicable")
        when s.phase_code is not null and s.phase_code != 0
            then s.phase_code
        -- 2. Infer from statutory age range (independent schools still publish these)
        when s.statutory_high_age is not null and s.statutory_high_age <= 11 then 2
        when s.statutory_low_age is not null and s.statutory_low_age >= 11 then 4
        when s.statutory_low_age is not null and s.statutory_high_age is not null
             and s.statutory_low_age < 11 and s.statutory_high_age > 11 then 7
        -- 3. Fallback: infer from school name (covers independents with missing ages)
        when s.school_name ilike '%primary%'
             or s.school_name ilike '%infant%'
             or s.school_name ilike '%junior%'
             or s.school_name ilike '%preparatory%'
             or s.school_name ilike '% prep school%'
             or s.school_name ilike '% prep %'
            then 2
        when s.school_name ilike '%secondary%'
             or s.school_name ilike '%high school%'
             or s.school_name ilike '%grammar%'
             or s.school_name ilike '%senior school%'
             or s.school_name ilike '%upper school%'
            then 4
        -- 4. Give up — null renders no phase pill
        else null
    end as phase_code,
    s.school_type_code,
    s.academy_trust_name,
    s.academy_trust_uid,
    s.religious_character_code,
    s.gender,
    s.statutory_low_age || '-' || s.statutory_high_age as age_range,
    -- GIAS OfficialSixthForm in code space: 1 = has, 2 = does not, 0 = N/A.
    -- Null (rare, new establishments) falls back to the statutory age range.
    case
        when s.official_sixth_form_code = 1 then true
        when s.official_sixth_form_code in (0, 2) then false
        else coalesce(s.statutory_high_age >= 18, false)
    end as has_sixth_form,
    s.capacity,
    s.total_pupils,
    concat_ws(' ', s.head_title, s.head_first_name, s.head_last_name) as headteacher_name,
    s.website,
    s.telephone,
    s.open_date,
    s.close_date,
    s.status_code,
    s.nursery_provision,
    s.admissions_policy_code,

    -- Latest Ofsted (populated after monthly Ofsted pipeline runs)
    {% if ofsted_relation is not none %}
    -- Prefer the graded overall effectiveness; fall back to the grade parsed
    -- from the latest ungraded (Section 8) outcome when no graded grade exists.
    coalesce(o.overall_effectiveness, o.ungraded_grade) as ofsted_grade,
    o.inspection_date as ofsted_date,
    o.framework as ofsted_framework
    {% else %}
    null::text as ofsted_grade,
    null::date as ofsted_date,
    null::text as ofsted_framework
    {% endif %}

from schools s
{% if ofsted_relation is not none %}
left join {{ ref('int_ofsted_latest') }} o on s.urn = o.urn
{% endif %}
-- 1 = Open; 3 = Open, but proposed to close (still operating; drops out when
-- GIAS flips to Closed — marts fully rebuild each run).
where s.status_code in (1, 3)
