-- Baltique OS Core 0.2 Patient Experience / CarePath extension
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

CREATE TABLE IF NOT EXISTS procedure_templates (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  slug VARCHAR(120) NOT NULL,
  name VARCHAR(190) NOT NULL,
  category VARCHAR(120) NOT NULL DEFAULT 'chirurgia_plastyczna',
  default_stage ENUM('consultation','qualification','tests','documents','payment','surgery_planned','postop','controls') NOT NULL DEFAULT 'qualification',
  description TEXT NULL,
  active TINYINT(1) NOT NULL DEFAULT 1,
  sort_order INT UNSIGNED NOT NULL DEFAULT 100,
  created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at DATETIME NULL,
  PRIMARY KEY (id),
  UNIQUE KEY uq_procedure_templates_slug (slug),
  KEY idx_procedure_templates_active (active, sort_order)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS patient_procedure_plans (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  patient_id BIGINT UNSIGNED NOT NULL,
  procedure_template_id BIGINT UNSIGNED NOT NULL,
  surgery_date DATE NULL,
  status ENUM('active','archived','cancelled') NOT NULL DEFAULT 'active',
  created_by_user_id BIGINT UNSIGNED NULL,
  created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at DATETIME NULL,
  PRIMARY KEY (id),
  KEY idx_patient_procedure_patient (patient_id, status),
  KEY idx_patient_procedure_template (procedure_template_id),
  KEY idx_patient_procedure_created_by (created_by_user_id),
  CONSTRAINT fk_patient_procedure_patient FOREIGN KEY (patient_id) REFERENCES patients(id) ON DELETE CASCADE,
  CONSTRAINT fk_patient_procedure_template FOREIGN KEY (procedure_template_id) REFERENCES procedure_templates(id),
  CONSTRAINT fk_patient_procedure_user FOREIGN KEY (created_by_user_id) REFERENCES users(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS carepath_task_templates (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  procedure_template_id BIGINT UNSIGNED NULL,
  slug VARCHAR(140) NOT NULL,
  stage ENUM('consultation','qualification','tests','documents','payment','surgery_planned','postop','controls') NOT NULL DEFAULT 'qualification',
  title VARCHAR(190) NOT NULL,
  description TEXT NULL,
  category ENUM('patient','staff','payment','tests','documents','phone','postop') NOT NULL DEFAULT 'patient',
  priority ENUM('low','normal','high','critical') NOT NULL DEFAULT 'normal',
  offset_anchor ENUM('assignment','surgery_date') NOT NULL DEFAULT 'assignment',
  due_offset_days INT NOT NULL DEFAULT 0,
  target ENUM('patient','staff') NOT NULL DEFAULT 'patient',
  active TINYINT(1) NOT NULL DEFAULT 1,
  sort_order INT UNSIGNED NOT NULL DEFAULT 100,
  created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  UNIQUE KEY uq_carepath_task_slug (slug),
  KEY idx_carepath_task_procedure (procedure_template_id, active),
  CONSTRAINT fk_carepath_task_procedure FOREIGN KEY (procedure_template_id) REFERENCES procedure_templates(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS communication_templates (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  procedure_template_id BIGINT UNSIGNED NULL,
  slug VARCHAR(140) NOT NULL,
  channel ENUM('portal','email','sms','whatsapp') NOT NULL DEFAULT 'portal',
  trigger_slug VARCHAR(140) NOT NULL,
  subject VARCHAR(190) NULL,
  body TEXT NOT NULL,
  active TINYINT(1) NOT NULL DEFAULT 1,
  sort_order INT UNSIGNED NOT NULL DEFAULT 100,
  created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  UNIQUE KEY uq_communication_template_slug (slug),
  KEY idx_communication_template_procedure (procedure_template_id, active),
  CONSTRAINT fk_communication_template_procedure FOREIGN KEY (procedure_template_id) REFERENCES procedure_templates(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO procedure_templates (slug, name, category, description, active, sort_order) VALUES
('powiekszenie-piersi-implantami','Powiększenie piersi implantami','chirurgia_piersi','Operacyjna ścieżka przygotowania do augmentacji piersi implantami.',1,10),
('abdominoplastyka','Abdominoplastyka','chirurgia_sylwetki','Operacyjna ścieżka przygotowania do plastyki powłok brzucha.',1,20),
('blefaroplastyka','Blefaroplastyka','chirurgia_twarzy','Operacyjna ścieżka przygotowania do plastyki powiek.',1,30),
('rhinoplastyka','Rhinoplastyka','chirurgia_twarzy','Operacyjna ścieżka przygotowania do operacji nosa.',1,40),
('liposukcja','Liposukcja','chirurgia_sylwetki','Operacyjna ścieżka przygotowania do liposukcji.',1,50)
ON DUPLICATE KEY UPDATE name=VALUES(name), category=VALUES(category), description=VALUES(description), active=VALUES(active), sort_order=VALUES(sort_order), updated_at=NOW();

-- Common patient journey tasks
INSERT INTO carepath_task_templates (procedure_template_id, slug, stage, title, description, category, priority, offset_anchor, due_offset_days, target, sort_order) VALUES
(NULL,'common-medical-survey','qualification','Uzupełnij ankietę medyczną','Uzupełnij w Paszporcie Opieki podstawowy wywiad organizacyjny. Formalny wpis medyczny pozostaje w OpenCare.', 'patient','high','assignment',2,'patient',10),
(NULL,'common-upload-labs','tests','Prześlij wymagane wyniki badań','Dodaj wyniki badań w formacie PDF lub zdjęcia. Koordynator oznaczy je jako do weryfikacji, a lekarz/anestezjolog zatwierdzi w razie potrzeby.', 'tests','high','surgery_date',-21,'patient',20),
(NULL,'common-confirm-instructions','documents','Potwierdź przeczytanie instrukcji przedoperacyjnych','Przeczytaj instrukcje przygotowania i potwierdź zapoznanie się w portalu.', 'documents','high','surgery_date',-14,'patient',30),
(NULL,'common-surgery-deposit','payment','Opłać zadatek operacyjny 10%','Zadatek potwierdza rezerwację terminu operacji. W Core 0.2 status płatności może być oznaczony ręcznie.', 'payment','high','assignment',3,'patient',40),
(NULL,'common-balance-payment','payment','Opłać pozostałą kwotę za operację','Pozostała kwota powinna zostać opłacona najpóźniej 14 dni przed operacją, chyba że koordynator ustali inaczej.', 'payment','high','surgery_date',-14,'patient',50),
(NULL,'common-upload-photos','qualification','Dodaj zdjęcia do oceny przedoperacyjnej','Prześlij zdjęcia zgodnie z instrukcją kliniki. Zdjęcia służą organizacji opieki w Baltique OS, formalna dokumentacja pozostaje w OpenCare.', 'patient','normal','assignment',5,'patient',60),
(NULL,'common-confirm-arrival','surgery_planned','Potwierdź godzinę przyjęcia','Potwierdź, że znasz datę, godzinę i lokalizację przyjęcia oraz wiesz, jak przygotować się do zabiegu.', 'patient','high','surgery_date',-3,'patient',70)
ON DUPLICATE KEY UPDATE title=VALUES(title), description=VALUES(description), category=VALUES(category), priority=VALUES(priority), offset_anchor=VALUES(offset_anchor), due_offset_days=VALUES(due_offset_days), target=VALUES(target), sort_order=VALUES(sort_order);

-- Procedure-specific task templates
INSERT INTO carepath_task_templates (procedure_template_id, slug, stage, title, description, category, priority, offset_anchor, due_offset_days, target, sort_order) VALUES
((SELECT id FROM procedure_templates WHERE slug='powiekszenie-piersi-implantami'),'breast-confirm-implant-plan','qualification','Potwierdź plan implantów i zakres zabiegu','Koordynator potwierdzi z Tobą rozmiar, profil i dostępność implantów oraz uzupełni status w systemie.', 'staff','high','surgery_date',-14,'staff',110),
((SELECT id FROM procedure_templates WHERE slug='powiekszenie-piersi-implantami'),'breast-order-bra','postop','Dobierz biustonosz pooperacyjny','Zamów lub potwierdź biustonosz pooperacyjny dobrany do zaleceń kliniki.', 'patient','normal','surgery_date',-10,'patient',120),
((SELECT id FROM procedure_templates WHERE slug='abdominoplastyka'),'abd-compression-garment','postop','Dobierz pas/body uciskowe','Koordynator pomoże dobrać odzież kompresyjną wymaganą po abdominoplastyce.', 'patient','normal','surgery_date',-10,'patient',130),
((SELECT id FROM procedure_templates WHERE slug='abdominoplastyka'),'abd-physio-plan','postop','Zaplanuj fizjoterapię pooperacyjną','Ustal wstępny plan fizjoterapii i drenażu zgodnie z decyzją lekarza prowadzącego.', 'postop','normal','surgery_date',7,'patient',140),
((SELECT id FROM procedure_templates WHERE slug='blefaroplastyka'),'bleph-photo-set','qualification','Dodaj zdjęcia powiek i twarzy','Prześlij zdjęcia zgodnie z instrukcją: przód, profile i zbliżenia okolicy powiek.', 'patient','normal','assignment',5,'patient',150),
((SELECT id FROM procedure_templates WHERE slug='blefaroplastyka'),'bleph-cooling-kit','postop','Przygotuj zestaw chłodzący po zabiegu','Przygotuj zalecany zestaw chłodzący i organizację powrotu do domu po zabiegu.', 'patient','normal','surgery_date',-3,'patient',160),
((SELECT id FROM procedure_templates WHERE slug='rhinoplastyka'),'rhino-photo-set','qualification','Dodaj zdjęcia nosa i profilu','Prześlij standaryzowane zdjęcia: przód, profile, półprofile, widok od dołu.', 'patient','normal','assignment',5,'patient',170),
((SELECT id FROM procedure_templates WHERE slug='rhinoplastyka'),'rhino-recovery-plan','postop','Przeczytaj plan rekonwalescencji po operacji nosa','Zapoznaj się z informacjami dotyczącymi obrzęku, opatrunku, kontroli i aktywności po zabiegu.', 'documents','normal','surgery_date',-7,'patient',180),
((SELECT id FROM procedure_templates WHERE slug='liposukcja'),'lipo-compression-garment','postop','Dobierz odzież kompresyjną','Dobierz właściwy rozmiar odzieży kompresyjnej do zakresu liposukcji.', 'patient','normal','surgery_date',-10,'patient',190),
((SELECT id FROM procedure_templates WHERE slug='liposukcja'),'lipo-drainage-plan','postop','Zaplanuj drenaż/fizjoterapię po zabiegu','Ustal wstępny plan wsparcia pooperacyjnego, jeżeli lekarz prowadzący nie widzi przeciwwskazań.', 'postop','normal','surgery_date',7,'patient',200)
ON DUPLICATE KEY UPDATE title=VALUES(title), description=VALUES(description), category=VALUES(category), priority=VALUES(priority), offset_anchor=VALUES(offset_anchor), due_offset_days=VALUES(due_offset_days), target=VALUES(target), sort_order=VALUES(sort_order);

INSERT INTO communication_templates (procedure_template_id, slug, channel, trigger_slug, subject, body, active, sort_order) VALUES
(NULL,'common-booking-confirmed-email','email','booking_confirmed','Potwierdzenie rezerwacji konsultacji Baltique','Dziękujemy za rezerwację konsultacji. W Paszporcie Opieki znajdziesz termin, płatność i kolejne kroki.',1,10),
(NULL,'common-missing-tests-whatsapp','whatsapp','missing_tests','Przypomnienie: brakuje wyników badań','Dzień dobry, w Paszporcie Opieki widzimy brakujące wyniki badań. Prosimy o ich przesłanie lub kontakt z koordynatorem.',1,20),
(NULL,'common-preop-reminder-sms','sms','preop_72h','Przypomnienie przedoperacyjne','Baltique: przypominamy o przygotowaniu do zabiegu zgodnie z instrukcją w Paszporcie Opieki. W razie pytań prosimy o kontakt.',1,30)
ON DUPLICATE KEY UPDATE channel=VALUES(channel), trigger_slug=VALUES(trigger_slug), subject=VALUES(subject), body=VALUES(body), active=VALUES(active), sort_order=VALUES(sort_order);

INSERT INTO app_settings (setting_key, setting_value, created_at, updated_at) VALUES
('core_version','0.2.0',NOW(),NOW()),
('carepath_enabled','1',NOW(),NOW())
ON DUPLICATE KEY UPDATE setting_value=VALUES(setting_value), updated_at=NOW();

SET FOREIGN_KEY_CHECKS = 1;
