-- ============================================================
-- 桃育种·花粉档案（bre_pollen）+ 授粉表花粉批次外键
-- 背景：桃花期仅 3–7 天，父本花粉是杂交季命脉。花粉需采集、贮藏、测活力，
--       授粉窗口（采集日→失效日）校验支撑"当前花期可用批次"与复盘坐果率。
-- 幂等：CREATE TABLE IF NOT EXISTS / ADD COLUMN IF NOT EXISTS，可重复执行。
-- 说明：bre_pollen 表可由 create_all 建，此处显式落库保证先于后端重启存在；
--       bre_pollination 已存在，新列必须 ALTER。
-- ============================================================

CREATE TABLE IF NOT EXISTS bre_pollen (
    id                  SERIAL PRIMARY KEY,
    uuid                varchar(64) NOT NULL UNIQUE,
    is_deleted          boolean     NOT NULL DEFAULT false,
    created_time        timestamptz NOT NULL DEFAULT now(),
    updated_time        timestamptz NOT NULL DEFAULT now(),
    deleted_time        timestamptz,
    created_id          integer     REFERENCES sys_user(id) ON DELETE SET NULL,
    updated_id          integer     REFERENCES sys_user(id) ON DELETE SET NULL,
    deleted_id          integer     REFERENCES sys_user(id) ON DELETE SET NULL,

    -- 领域字段
    lot_code            varchar(64)  NOT NULL UNIQUE,          -- 花粉批次号（如 PL-2026-0001）
    male_tree_id        integer      REFERENCES bre_tree(id) ON DELETE SET NULL,  -- 采集父本树（混合/外地可空）
    source_type         varchar(16)  NOT NULL DEFAULT 'tree',  -- tree父本树 / mixed混合花粉 / external外地采集
    source_desc         varchar(128),                          -- 来源说明（混合配比/外地品种）
    collect_date        date,                                  -- 花粉采集日期
    collect_method      varchar(32),                           -- 采集方式（采花取粉/振动收集…）
    quantity            varchar(32),                           -- 采集量（如 50g / 花药数）
    storage_method      varchar(16)  NOT NULL DEFAULT 'fridge',-- 贮藏方式 fridge4℃ / minus20 / minus80 / liquid_n2液氮
    viability_method    varchar(16),                           -- 活力测定 ttc(TTC染色率) / germination(离体萌发率%)
    viability_pct       double precision,                      -- 花粉活力 %
    viability_test_date date,                                  -- 活力测定日期
    expiry_date         date,                                  -- 有效期/失效日期（授粉窗口上界）
    remark              text
);

CREATE INDEX IF NOT EXISTS ix_bre_pollen_created_deleted ON bre_pollen (created_time, is_deleted);
CREATE INDEX IF NOT EXISTS ix_bre_pollen_male_tree_id     ON bre_pollen (male_tree_id);

COMMENT ON TABLE bre_pollen IS '花粉档案：采集父本/日期/贮藏/活力/有效期，授粉窗口计划地基';
COMMENT ON COLUMN bre_pollen.lot_code             IS '花粉批次号（唯一，如 PL-2026-0001）';
COMMENT ON COLUMN bre_pollen.male_tree_id         IS '采集父本树 FK→bre_tree（混合/外地采集可空）';
COMMENT ON COLUMN bre_pollen.source_type          IS '来源类型 tree父本树/mixed混合花粉/external外地采集';
COMMENT ON COLUMN bre_pollen.collect_date         IS '花粉采集日期';
COMMENT ON COLUMN bre_pollen.collect_method       IS '采集方式（采花取粉/振动收集…）';
COMMENT ON COLUMN bre_pollen.storage_method       IS '贮藏方式 fridge4℃/minus20/minus80/liquid_n2液氮';
COMMENT ON COLUMN bre_pollen.viability_method     IS '活力测定方法 ttc(TTC染色率)/germination(离体萌发率%)';
COMMENT ON COLUMN bre_pollen.viability_pct        IS '花粉活力 %';
COMMENT ON COLUMN bre_pollen.viability_test_date  IS '活力测定日期';
COMMENT ON COLUMN bre_pollen.expiry_date          IS '有效期/失效日期（授粉窗口上界）';

-- 授粉表补花粉批次外键（窗口校验：授粉日期须在 [采集日, 失效日] 内）
ALTER TABLE bre_pollination ADD COLUMN IF NOT EXISTS pollen_lot_id integer NULL REFERENCES bre_pollen(id) ON DELETE SET NULL;
CREATE INDEX IF NOT EXISTS ix_bre_pollination_pollen_lot_id ON bre_pollination (pollen_lot_id);
COMMENT ON COLUMN bre_pollination.pollen_lot_id IS '花粉批次 FK→bre_pollen（授粉所用花粉，支撑父本效力分析与窗口校验）';

-- 授粉表补授粉方式（一期文档规划，此前遗漏）
ALTER TABLE bre_pollination ADD COLUMN IF NOT EXISTS pollination_method varchar(32);
COMMENT ON COLUMN bre_pollination.pollination_method IS '授粉方式（人工点授/喷粉/涂抹…）';
