-- ========= HR: ИНСТРУКТАЖИ И КУРСЫ (БЛОК ОБУЧЕНИЯ) =========

-- Тип обучения
DO $$
BEGIN
    IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'training_type') THEN
        CREATE TYPE training_type AS ENUM (
            'instruction',      -- Инструктаж
            'course',           -- Курс
            'certification',    -- Сертификация
            'exam',             -- Экзамен
            'other'             -- Другое
        );
    END IF;
END$$;

-- Категория обучения
DO $$
BEGIN
    IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'training_category') THEN
        CREATE TYPE training_category AS ENUM (
            'safety',           -- Техника безопасности
            'fire_safety',      -- Пожарная безопасность
            'electrical',       -- Электротехническая безопасность
            'first_aid',        -- Первая помощь
            'professional',     -- Профессиональное обучение
            'compliance',       -- Соответствие требованиям
            'other'             -- Другое
        );
    END IF;
END$$;

-- Статус прохождения обучения
DO $$
BEGIN
    IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'training_status') THEN
        CREATE TYPE training_status AS ENUM (
            'not_started',      -- Не начато
            'in_progress',      -- В процессе
            'completed',        -- Завершено
            'failed',           -- Не пройдено
            'expired',          -- Просрочено
            'cancelled'         -- Отменено
        );
    END IF;
END$$;

-- Таблица программ обучения (инструктажи и курсы)
CREATE TABLE IF NOT EXISTS training_programs (
  id                    VARCHAR(50) PRIMARY KEY,
  title                 TEXT NOT NULL,                    -- Название программы
  description           TEXT,                             -- Описание
  type                  training_type NOT NULL,           -- Тип обучения
  category              training_category NOT NULL,       -- Категория
  duration_hours        NUMERIC(5, 2),                   -- Длительность в часах
  validity_months       INTEGER,                          -- Срок действия в месяцах (NULL = бессрочно)
  is_required           BOOLEAN DEFAULT false,            -- Обязательное обучение
  required_for_positions TEXT[],                          -- Должности, для которых обязательно
  instructor_name       TEXT,                             -- Инструктор/преподаватель
  materials_url         TEXT,                             -- Ссылка на материалы
  created_at            TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  updated_at            TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

CREATE INDEX IF NOT EXISTS idx_training_programs_type ON training_programs(type);
CREATE INDEX IF NOT EXISTS idx_training_programs_category ON training_programs(category);
CREATE INDEX IF NOT EXISTS idx_training_programs_required ON training_programs(is_required);

-- Таблица прохождения обучения сотрудниками
CREATE TABLE IF NOT EXISTS employee_training (
  id                    BIGSERIAL PRIMARY KEY,
  employee_id           VARCHAR(50) NOT NULL REFERENCES employees(id) ON DELETE CASCADE,
  program_id            VARCHAR(50) NOT NULL REFERENCES training_programs(id) ON DELETE CASCADE,
  status                training_status NOT NULL DEFAULT 'not_started',
  -- Даты
  start_date            DATE,                             -- Дата начала
  completion_date       DATE,                             -- Дата завершения
  expiry_date           DATE,                             -- Дата окончания срока действия
  -- Результаты
  score                 NUMERIC(5, 2),                   -- Оценка/балл (если есть)
  passed                BOOLEAN,                           -- Сдано/не сдано
  certificate_number    TEXT,                             -- Номер сертификата
  certificate_url       TEXT,                             -- Ссылка на сертификат
  -- Дополнительная информация
  notes                 TEXT,                             -- Заметки
  instructor_name       TEXT,                             -- Кто проводил (может отличаться от программы)
  location              TEXT,                             -- Место проведения
  -- Служебные поля
  created_at            TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  updated_at            TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  -- Уникальность: один сотрудник может проходить программу только один раз
  -- (но можно пересдавать, если статус 'failed' или 'expired')
  UNIQUE(employee_id, program_id)
);

CREATE INDEX IF NOT EXISTS idx_employee_training_employee ON employee_training(employee_id);
CREATE INDEX IF NOT EXISTS idx_employee_training_program ON employee_training(program_id);
CREATE INDEX IF NOT EXISTS idx_employee_training_status ON employee_training(status);
CREATE INDEX IF NOT EXISTS idx_employee_training_expiry ON employee_training(expiry_date);

-- Таблица истории прохождения (для отслеживания пересдач и обновлений)
CREATE TABLE IF NOT EXISTS employee_training_history (
  id                    BIGSERIAL PRIMARY KEY,
  employee_training_id  BIGINT NOT NULL REFERENCES employee_training(id) ON DELETE CASCADE,
  status                training_status NOT NULL,
  completion_date       DATE,
  score                 NUMERIC(5, 2),
  passed                BOOLEAN,
  certificate_number    TEXT,
  notes                 TEXT,
  created_at            TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

CREATE INDEX IF NOT EXISTS idx_training_history_training ON employee_training_history(employee_training_id);
CREATE INDEX IF NOT EXISTS idx_training_history_date ON employee_training_history(created_at DESC);

-- Комментарии к таблицам
COMMENT ON TABLE training_programs IS 'Программы обучения: инструктажи, курсы, сертификации';
COMMENT ON TABLE employee_training IS 'Прохождение обучения сотрудниками';
COMMENT ON TABLE employee_training_history IS 'История прохождения обучения (для отслеживания пересдач)';

COMMENT ON COLUMN training_programs.validity_months IS 'Срок действия обучения в месяцах. NULL = бессрочно';
COMMENT ON COLUMN training_programs.required_for_positions IS 'Массив должностей, для которых обучение обязательно';
COMMENT ON COLUMN employee_training.expiry_date IS 'Дата окончания срока действия. Рассчитывается автоматически на основе validity_months программы';
