-- /queue/sql/schema.sql

-- ตารางสำหรับเก็บข้อมูลบริษัท
CREATE TABLE queue_company (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  code VARCHAR(50) NOT NULL UNIQUE,
  name VARCHAR(200) NOT NULL,
  is_active TINYINT(1) DEFAULT 1
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ตารางสำหรับเก็บข้อมูลสาขา
CREATE TABLE queue_site (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  company_id BIGINT NOT NULL,
  code VARCHAR(50) NOT NULL,
  name VARCHAR(200) NOT NULL,
  is_active TINYINT(1) DEFAULT 1,
  UNIQUE(company_id, code),
  CONSTRAINT fk_queue_site_company FOREIGN KEY (company_id) REFERENCES queue_company(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ตารางสำหรับบทบาท (Roles)
CREATE TABLE queue_role (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  code VARCHAR(50) NOT NULL UNIQUE,
  name VARCHAR(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ตารางสำหรับเก็บข้อมูลผู้ใช้
CREATE TABLE queue_app_user (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  login VARCHAR(80) NOT NULL UNIQUE,
  display_name VARCHAR(120) NOT NULL,
  password_hash VARCHAR(255) NULL, -- เดี๋ยวค่อยทำ auth จริง
  is_active TINYINT(1) DEFAULT 1
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ตารางที่ผูกผู้ใช้กับบทบาทและสาขา
CREATE TABLE queue_user_role_site (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  user_id BIGINT NOT NULL,
  role_id BIGINT NOT NULL,
  site_id BIGINT NOT NULL,
  UNIQUE(user_id, role_id, site_id),
  FOREIGN KEY (user_id) REFERENCES queue_app_user(id),
  FOREIGN KEY (role_id) REFERENCES queue_role(id),
  FOREIGN KEY (site_id) REFERENCES queue_site(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ตารางสำหรับเก็บคิว
CREATE TABLE queue_queue (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  site_id BIGINT NOT NULL,
  code VARCHAR(50) NOT NULL,
  name VARCHAR(100) NOT NULL,
  role_id BIGINT NOT NULL,
  is_active TINYINT(1) DEFAULT 1,
  UNIQUE(site_id, code),
  FOREIGN KEY (site_id) REFERENCES queue_site(id),
  FOREIGN KEY (role_id) REFERENCES queue_role(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ตารางสำหรับเก็บเคส (Case) ของลูกค้า
CREATE TABLE queue_case_header (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  case_code VARCHAR(30) NOT NULL UNIQUE,     -- เช่น Q0001
  company_id BIGINT NOT NULL,
  site_id BIGINT NOT NULL,
  case_type VARCHAR(50) NOT NULL,            -- restaurant_order / clinic_visit / ...
  customer_ref VARCHAR(120) NULL,            -- เบอร์โต๊ะ/เบอร์โทร/เลขบัตรคิว
  status VARCHAR(30) NOT NULL DEFAULT 'open',
  priority INT DEFAULT 0,
  sla_due_at DATETIME NULL,
  created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  closed_at DATETIME NULL,
  FOREIGN KEY (company_id) REFERENCES queue_company(id),
  FOREIGN KEY (site_id) REFERENCES queue_site(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ตารางสำหรับเก็บงาน (Job) ที่ทำจริง
CREATE TABLE queue_job (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  job_code VARCHAR(30) NOT NULL UNIQUE,      -- เช่น D0001, K0001
  case_id BIGINT NOT NULL,
  parent_job_id BIGINT NULL,
  job_type VARCHAR(50) NOT NULL,             -- kitchen_prep / waiter_serve / cashier_bill
  current_state VARCHAR(30) NOT NULL,        -- queued/assigned/started/.../completed
  queue_id BIGINT NULL,                      -- ตอนนี้อยู่วิถีคิวไหน
  assigned_user_id BIGINT NULL,              -- ใครถืออยู่ (ถ้า claim แล้ว)
  required_skills JSON NULL,                 -- ใช้ภายหลัง
  required_resources JSON NULL,              -- ใช้ภายหลัง
  planned_start_at DATETIME NULL,
  started_at DATETIME NULL,
  finished_at DATETIME NULL,
  created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (case_id) REFERENCES queue_case_header(id),
  FOREIGN KEY (parent_job_id) REFERENCES queue_job(id),
  FOREIGN KEY (queue_id) REFERENCES queue_queue(id),
  FOREIGN KEY (assigned_user_id) REFERENCES queue_app_user(id),
  INDEX (case_id), INDEX (queue_id), INDEX (current_state)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ตารางสำหรับเก็บ Event ของแต่ละ Job
CREATE TABLE queue_job_event (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  job_id BIGINT NOT NULL,
  event_type VARCHAR(50) NOT NULL,           -- created/queued/assigned/started/completed/...
  actor_user_id BIGINT NULL,
  meta JSON NULL,
  created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (job_id) REFERENCES queue_job(id),
  INDEX (job_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ตารางสำหรับเก็บเส้นทางการทำงาน (State → Queue/Role per case_type)
CREATE TABLE queue_workflow_route (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  case_type VARCHAR(50) NOT NULL,            -- restaurant_order / clinic_visit ...
  state VARCHAR(50) NOT NULL,                -- new / preparing / ready_to_serve / waiting_for_bill / done
  site_id BIGINT NOT NULL,
  queue_id BIGINT NULL,                      -- null = ไม่ต้องเข้าคิว (เช่น done)
  assign_strategy VARCHAR(20) NOT NULL DEFAULT 'pull', -- push / pull / broadcast
  UNIQUE(case_type, state, site_id),
  FOREIGN KEY (site_id) REFERENCES queue_site(id),
  FOREIGN KEY (queue_id) REFERENCES queue_queue(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ตารางสำหรับเก็บลำดับรหัส
CREATE TABLE queue_code_seq (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  key_name VARCHAR(50) NOT NULL UNIQUE,
  last_number BIGINT NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
