-- Tạo hierarchy_path cho equipment

ALTER TABLE equipment_category
ADD COLUMN hierarchy_path text;

WITH RECURSIVE category_tree AS (
  SELECT
    ec.equipment_code,
    ec.belonged_category_code,
    ec.equipment_code AS root_code,
    ec.equipment_code AS leaf_code,
    ec.equipment_code::text AS path
  FROM equipment_category ec
  WHERE ec.belonged_category_code = ''

  UNION ALL

  SELECT
    child.equipment_code,
    child.belonged_category_code,
    root.root_code,
    child.equipment_code AS leaf_code,
    root.path || '>' || child.equipment_code AS path
  FROM equipment_category child
  JOIN category_tree root ON child.belonged_category_code = root.leaf_code
)
UPDATE equipment_category ec
SET hierarchy_path = ct.path
FROM category_tree ct
WHERE ec.equipment_code = ct.equipment_code;




-- Tạo bảng fact

DROP TABLE IF EXISTS "trangbi"."fact_equipment_summary";
CREATE TABLE "trangbi"."fact_equipment_summary" (
   id SERIAL PRIMARY KEY,
  "unit_code" text COLLATE "pg_catalog"."default",
  "unit_name" text COLLATE "pg_catalog"."default",
  "unit_parent_code" text COLLATE "pg_catalog"."default",
  "unit_level" numeric,
  "equipment_category_code" text COLLATE "pg_catalog"."default",
  "equipment_category_name" text COLLATE "pg_catalog"."default",
  "equipment_category_parent_code" text COLLATE "pg_catalog"."default",
  "equipment_division_code" text COLLATE "pg_catalog"."default",
  "equipment_division_name" text COLLATE "pg_catalog"."default",
  "equipment_condition_code" text COLLATE "pg_catalog"."default",
  "equipment_condition_name" text COLLATE "pg_catalog"."default",
  "report_period" text COLLATE "pg_catalog"."default",
  "hierarchy_path_unit" text COLLATE "pg_catalog"."default",
  "equipment_category_unit" text COLLATE "pg_catalog"."default",
  "hierarchy_path_equipment_category" text COLLATE "pg_catalog"."default",
  "quantity" numeric
)
;


-- Đánh index cho bảng fact

CREATE INDEX idx_fact_equipment_summary_report_period ON fact_equipment_summary (report_period);

CREATE INDEX idx_fact_equipment_summary_unit_code ON fact_equipment_summary (unit_code);
CREATE INDEX idx_fact_equipment_summary_hierarchy_path_unit ON fact_equipment_summary (hierarchy_path_unit text_pattern_ops);

CREATE INDEX idx_fact_equipment_summary_equipment_category_code ON fact_equipment_summary (equipment_category_code);
CREATE INDEX idx_fact_equipment_summary_hierarchy_path_equipment ON fact_equipment_summary (hierarchy_path_equipment_category text_pattern_ops);

CREATE INDEX idx_fact_equipment_summary_report_unit ON fact_equipment_summary (report_period, unit_code);
CREATE INDEX idx_fact_equipment_summary_report_equipment ON fact_equipment_summary (report_period, equipment_category_code);

CREATE INDEX idx_fact_equipment_summary_quantity ON fact_equipment_summary (quantity);



-- Đổ dữ liệu vào bảng fact


INSERT INTO fact_equipment_summary (
    unit_code,
    unit_name,
    unit_parent_code,
    unit_level,
    equipment_category_code,
    equipment_category_name,
    equipment_category_parent_code,
    equipment_division_code,
    equipment_division_name,
    equipment_condition_code,
    equipment_condition_name,
    report_period,
    hierarchy_path_unit,
    equipment_category_unit,
    hierarchy_path_equipment_category,
    quantity
  )
  SELECT 
    u1.code AS unit_code,
    u1.unit_name AS unit_name,
    u1.belonged_unit_code AS unit_parent_code,
    u1.unit_level AS unit_level,
    m.equipment_category_code,
    ec.equipment_name AS equipment_category_name,
    ec.belonged_category_code AS equipment_category_parent_code,
    ec.equipment_division_code,
    ed.name AS equipment_division_name,
    ecd.equipment_condition_code,
    ecd.description AS equipment_condition_name,
    m.report_period,
    u1.hierarchy_path AS hierarchy_path_unit,
		ec.unit,
    ec.hierarchy_path AS hierarchy_path_equipment_category,
    SUM(d.quantity) AS quantity
  FROM equipment_period_report m
  JOIN equipment_period_report_detail d ON d.equipment_period_report_id = m.equipment_period_report_id
  JOIN unit u1 ON u1.code = m.unit_code
  JOIN equipment_category ec on ec.equipment_code = m.equipment_category_code
  JOIN equipment_division ed on ed.code = ec.equipment_division_code
  JOIN equipment_condition ecd on ecd.equipment_condition_code = d.equipment_condition_code

  GROUP BY 
  u1.code,
  u1.unit_name,
  u1.belonged_unit_code,
  u1.unit_level,
  m.equipment_category_code,
  ec.equipment_name,
	ec.unit,
  ec.belonged_category_code,
  ec.equipment_division_code,
  ed.name,
  ecd.equipment_condition_code,
  ecd.description,
  m.report_period,
  u1.hierarchy_path,
  ec.hierarchy_path;

