-- ============================================================
-- NutriApp — Migración inicial
-- ============================================================

-- Habilitar extensión UUID
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

-- ─── Familias ────────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS familias (
    id                  UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    nombre              VARCHAR(255) NOT NULL,
    codigo_invitacion   VARCHAR(8) UNIQUE NOT NULL,
    creador_id          UUID,
    created_at          TIMESTAMPTZ NOT NULL DEFAULT now()
);

-- ─── Usuarios ────────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS usuarios (
    id              UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    email           VARCHAR(255) UNIQUE NOT NULL,
    nombre          VARCHAR(255) NOT NULL,
    password_hash   TEXT NOT NULL,
    familia_id      UUID REFERENCES familias(id) ON DELETE SET NULL,
    created_at      TIMESTAMPTZ NOT NULL DEFAULT now()
);

-- FK circular: creador_id → usuarios
ALTER TABLE familias
    ADD CONSTRAINT fk_familias_creador
    FOREIGN KEY (creador_id) REFERENCES usuarios(id) ON DELETE SET NULL;

-- ─── Ingredientes (catálogo global por familia) ──────────────
CREATE TABLE IF NOT EXISTS ingredientes (
    id              UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    familia_id      UUID NOT NULL REFERENCES familias(id) ON DELETE CASCADE,
    nombre          VARCHAR(255) NOT NULL,
    categoria       VARCHAR(50),
    unidad_medida   VARCHAR(20) NOT NULL DEFAULT 'unidad',
    created_at      TIMESTAMPTZ NOT NULL DEFAULT now(),
    UNIQUE(familia_id, nombre)
);

-- ─── Recetas ─────────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS recetas (
    id                      UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    familia_id              UUID NOT NULL REFERENCES familias(id) ON DELETE CASCADE,
    creador_id              UUID NOT NULL REFERENCES usuarios(id) ON DELETE CASCADE,
    nombre                  VARCHAR(255) NOT NULL,
    descripcion             TEXT,
    porciones               INTEGER NOT NULL DEFAULT 1,
    tiempo_preparacion_min  INTEGER,
    instrucciones           TEXT,
    imagen_url              TEXT,
    created_at              TIMESTAMPTZ NOT NULL DEFAULT now(),
    updated_at              TIMESTAMPTZ NOT NULL DEFAULT now()
);

-- ─── Ingredientes de cada receta ────────────────────────────
CREATE TABLE IF NOT EXISTS receta_ingredientes (
    id              UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    receta_id       UUID NOT NULL REFERENCES recetas(id) ON DELETE CASCADE,
    ingrediente_id  UUID NOT NULL REFERENCES ingredientes(id) ON DELETE CASCADE,
    cantidad        DOUBLE PRECISION NOT NULL,
    unidad          VARCHAR(20) NOT NULL DEFAULT 'unidad',
    UNIQUE(receta_id, ingrediente_id)
);

-- ─── Calendario semanal (slots de comida) ──────────────────
CREATE TABLE IF NOT EXISTS slots_comida (
    id              UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    familia_id      UUID NOT NULL REFERENCES familias(id) ON DELETE CASCADE,
    fecha           DATE NOT NULL,
    tipo            VARCHAR(20) NOT NULL CHECK (tipo IN ('desayuno', 'comida', 'cena')),
    receta_id       UUID REFERENCES recetas(id) ON DELETE SET NULL,
    porciones       INTEGER NOT NULL DEFAULT 1,
    creado_por      UUID REFERENCES usuarios(id) ON DELETE SET NULL,
    created_at      TIMESTAMPTZ NOT NULL DEFAULT now(),
    UNIQUE(familia_id, fecha, tipo, receta_id)
);

-- ─── Inventario familiar ────────────────────────────────────
CREATE TABLE IF NOT EXISTS inventario (
    id              UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    familia_id      UUID NOT NULL REFERENCES familias(id) ON DELETE CASCADE,
    ingrediente_id  UUID NOT NULL REFERENCES ingredientes(id) ON DELETE CASCADE,
    cantidad        DOUBLE PRECISION NOT NULL DEFAULT 0,
    unidad          VARCHAR(20) NOT NULL,
    updated_at      TIMESTAMPTZ NOT NULL DEFAULT now(),
    UNIQUE(familia_id, ingrediente_id)
);

-- ─── Índices ─────────────────────────────────────────────────
CREATE INDEX idx_recetas_familia ON recetas(familia_id);
CREATE INDEX idx_slots_familia_fecha ON slots_comida(familia_id, fecha);
CREATE INDEX idx_inventario_familia ON inventario(familia_id);
CREATE INDEX idx_ingredientes_familia ON ingredientes(familia_id);
