-- Migration 027: add soft-delete columns and update views
-- Adds deleted_at to languages, tags, theses so deletions are reversible.

-- Add soft-delete columns (idempotent: ALTER TABLE ... ADD COLUMN fails gracefully if column exists)
ALTER TABLE languages ADD COLUMN deleted_at TEXT DEFAULT NULL;
ALTER TABLE tags      ADD COLUMN deleted_at TEXT DEFAULT NULL;
ALTER TABLE theses    ADD COLUMN deleted_at TEXT DEFAULT NULL;

-- Rebuild views to filter out soft-deleted rows.

DROP VIEW IF EXISTS v_theses_public;
DROP VIEW IF EXISTS v_theses_full;

CREATE VIEW v_theses_full AS
SELECT
    t.id,
    t.identifier,
    t.title,
    t.subtitle,
    t.year,
    t.is_doctoral,
    t.objet,
    o.name as orientation,
    ap.name as ap_program,
    ft.name as finality_type,
    t.synopsis,
    t.context_note,
    at.name as access_type,
    lt.name as license_type,
    t.license_id,
    t.license_custom,
    t.access_type_id,
    t.jury_points,
    t.submitted_at,
    t.defense_date,
    t.published_at,
    t.is_published,
    t.baiu_link,
    t.banner_path,
    t.exemplaire_baiu,
    t.exemplaire_erg,
    t.cc2r,
    t.remarks,
    t.jury_note_added,
    GROUP_CONCAT(DISTINCT a.name ORDER BY a.name ASC) as authors,
    GROUP_CONCAT(DISTINCT s.name) as supervisors,
    GROUP_CONCAT(DISTINCT CASE WHEN ts.role = 'president' THEN s.name END) as jury_president,
    GROUP_CONCAT(DISTINCT CASE WHEN ts.role = 'promoteur' AND ts.is_ulb = 0 THEN s.name END) as jury_promoteurs,
    GROUP_CONCAT(DISTINCT CASE WHEN ts.role = 'promoteur' AND ts.is_ulb = 1 THEN s.name END) as jury_promoteurs_ulb,
    GROUP_CONCAT(DISTINCT CASE WHEN ts.role = 'lecteur'   AND ts.is_external = 0 THEN s.name END) as jury_lecteurs_internes,
    GROUP_CONCAT(DISTINCT CASE WHEN ts.role = 'lecteur'   AND ts.is_external = 1 THEN s.name END) as jury_lecteurs_externes,
    GROUP_CONCAT(DISTINCT UPPER(SUBSTR(l.name,1,1)) || SUBSTR(l.name,2)) as languages,
    GROUP_CONCAT(DISTINCT fmt.name) as formats,
    GROUP_CONCAT(DISTINCT tg.name) as keywords,
    -- First author's email and contact-visibility flag
    (SELECT a2.email        FROM authors a2 JOIN thesis_authors ta2 ON a2.id = ta2.author_id WHERE ta2.thesis_id = t.id ORDER BY ta2.author_order LIMIT 1) as contact_interne,
    (SELECT a2.show_contact FROM authors a2 JOIN thesis_authors ta2 ON a2.id = ta2.author_id WHERE ta2.thesis_id = t.id ORDER BY ta2.author_order LIMIT 1) as contact_public
FROM theses t
LEFT JOIN orientations o ON t.orientation_id = o.id
LEFT JOIN ap_programs ap ON t.ap_program_id = ap.id
LEFT JOIN finality_types ft ON t.finality_id = ft.id
LEFT JOIN access_types at ON t.access_type_id = at.id
LEFT JOIN license_types lt ON t.license_id = lt.id
LEFT JOIN thesis_authors ta ON t.id = ta.thesis_id
LEFT JOIN authors a ON ta.author_id = a.id
LEFT JOIN thesis_supervisors ts ON t.id = ts.thesis_id
LEFT JOIN supervisors s ON ts.supervisor_id = s.id
LEFT JOIN thesis_languages tl ON t.id = tl.thesis_id
LEFT JOIN languages l ON tl.language_id = l.id AND l.deleted_at IS NULL
LEFT JOIN thesis_formats tf ON t.id = tf.thesis_id
LEFT JOIN format_types fmt ON tf.format_id = fmt.id
LEFT JOIN thesis_tags tt ON t.id = tt.thesis_id
LEFT JOIN tags tg ON tt.tag_id = tg.id AND tg.deleted_at IS NULL
WHERE t.deleted_at IS NULL
GROUP BY t.id;

-- Published theses only (for public view)
CREATE VIEW v_theses_public AS
SELECT * FROM v_theses_full
WHERE is_published = 1;
