DROP SCHEMA IF EXISTS gpi CASCADE;
-- Criar schema gpi
CREATE SCHEMA IF NOT EXISTS gpi;

-- Tabela organizations
CREATE TABLE IF NOT EXISTS gpi.organizations (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    name TEXT NOT NULL,
    created_at TIMESTAMPTZ DEFAULT NOW(),
    updated_at TIMESTAMPTZ DEFAULT NOW()
);

-- Inserir organização padrão
INSERT INTO gpi.organizations (id, name) 
VALUES ('e47e6210-4879-4e5b-bf21-9285d2713123', 'Organização Migrada')
ON CONFLICT (id) DO NOTHING;
CREATE TABLE IF NOT EXISTS gpi.users (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    logto_id TEXT UNIQUE,
    email TEXT NOT NULL,
    name TEXT,
    role TEXT DEFAULT 'user',
    is_banned BOOLEAN DEFAULT false,
    last_seen_at TIMESTAMPTZ,
    created_at TIMESTAMPTZ DEFAULT NOW(),
    updated_at TIMESTAMPTZ DEFAULT NOW()
);

CREATE TABLE IF NOT EXISTS gpi.projects (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    organization_id UUID NOT NULL,
    name TEXT NOT NULL,
    client TEXT,
    start_date DATE,
    end_date DATE,
    environment TEXT,
    technician TEXT,
    weight_kg DECIMAL(10,2),
    status TEXT DEFAULT 'active' CHECK (status IN ('active', 'archived')),
    created_at TIMESTAMPTZ DEFAULT NOW(),
    updated_at TIMESTAMPTZ DEFAULT NOW()
);

-- Tabela parts
CREATE TABLE IF NOT EXISTS gpi.parts (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    organization_id UUID NOT NULL,
    project_id UUID REFERENCES gpi.projects(id) ON DELETE CASCADE,
    description TEXT,
    dimensions TEXT,
    weight DECIMAL(10,3),
    type TEXT,
    area DECIMAL(10,3),
    complexity INTEGER DEFAULT 1,
    quantity INTEGER NOT NULL DEFAULT 1,
    notes TEXT,
    created_at TIMESTAMPTZ DEFAULT NOW(),
    updated_at TIMESTAMPTZ DEFAULT NOW()
);

-- Tabela painting_schemes
CREATE TABLE IF NOT EXISTS gpi.painting_schemes (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    organization_id UUID NOT NULL,
    project_id UUID REFERENCES gpi.projects(id) ON DELETE CASCADE,
    name TEXT NOT NULL,
    type TEXT,
    coat TEXT,
    solids_volume DECIMAL(12,3),
    yield_theoretical DECIMAL(12,3),
    eps_min DECIMAL(12,3),
    eps_max DECIMAL(12,3),
    dilution DECIMAL(12,3),
    manufacturer TEXT,
    color TEXT,
    paint_consumption DECIMAL(12,3),
    thinner_consumption DECIMAL(12,3),
    paint_id TEXT,
    thinner_id TEXT,
    color_hex TEXT,
    thinner_symbol TEXT,
    notes TEXT,
    created_at TIMESTAMPTZ DEFAULT NOW(),
    updated_at TIMESTAMPTZ DEFAULT NOW()
);

-- Tabela application_records
CREATE TABLE IF NOT EXISTS gpi.application_records (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    organization_id UUID NOT NULL,
    project_id UUID REFERENCES gpi.projects(id) ON DELETE CASCADE,
    coat_stage TEXT NOT NULL,
    piece_description TEXT,
    date DATE,
    operator TEXT,
    real_weight DECIMAL(10,3),
    volume_used DECIMAL(10,3),
    area_painted DECIMAL(10,3),
    wet_thickness_avg DECIMAL(6,2),
    dry_thickness_calc DECIMAL(6,2),
    real_yield DECIMAL(10,3),
    method TEXT,
    diluent_used DECIMAL(10,3),
    items JSONB,
    notes TEXT,
    created_at TIMESTAMPTZ DEFAULT NOW(),
    updated_at TIMESTAMPTZ DEFAULT NOW()
);

-- Tabela inspections
CREATE TABLE IF NOT EXISTS gpi.inspections (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    organization_id UUID NOT NULL,
    project_id UUID REFERENCES gpi.projects(id) ON DELETE CASCADE,
    application_record_id UUID REFERENCES gpi.application_records(id),
    stock_item_id TEXT,
    instrument_id TEXT,
    type TEXT CHECK (type IN ('painting', 'surface_treatment')),
    date DATE,
    inspector TEXT,
    part_temperature DECIMAL(6,2),
    weight_kg DECIMAL(10,3),
    appearance TEXT,
    defects TEXT,
    photos TEXT[],
    piece_description TEXT,
    eps_points DECIMAL(6,2)[],
    adhesion_test TEXT,
    batch TEXT,
    treatment_executor TEXT,
    treatment_type TEXT,
    cleaning_degree TEXT,
    roughness_readings DECIMAL(6,2)[],
    flash_rust TEXT,
    temperature DECIMAL(6,2),
    relative_humidity DECIMAL(5,2),
    period TEXT CHECK (period IN ('morning', 'afternoon', 'night')),
    created_at TIMESTAMPTZ DEFAULT NOW(),
    updated_at TIMESTAMPTZ DEFAULT NOW()
);

-- Tabela technical_data_sheets
CREATE TABLE IF NOT EXISTS gpi.technical_data_sheets (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    organization_id UUID NOT NULL,
    name TEXT NOT NULL,
    manufacturer TEXT,
    type TEXT,
    file_url TEXT,
    upload_date DATE,
    solids_volume DECIMAL(12,3),
    density DECIMAL(12,3),
    mixing_ratio TEXT,
    yield_theoretical DECIMAL(12,3),
    wft_min DECIMAL(12,3),
    wft_max DECIMAL(12,3),
    dft_min DECIMAL(12,3),
    dft_max DECIMAL(12,3),
    reducer TEXT,
    mixing_ratio_weight TEXT,
    mixing_ratio_volume TEXT,
    dft_reference DECIMAL(12,3),
    yield_factor DECIMAL(12,3),
    dilution DECIMAL(12,3),
    notes TEXT,
    manufacturer_code TEXT,
    min_stock DECIMAL(12,3),
    typical_application TEXT,
    created_at TIMESTAMPTZ DEFAULT NOW(),
    updated_at TIMESTAMPTZ DEFAULT NOW()
);

-- Tabela yield_studies
CREATE TABLE IF NOT EXISTS gpi.yield_studies (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    organization_id UUID NOT NULL,
    name TEXT NOT NULL,
    data_sheet_id TEXT NOT NULL,
    target_dft DECIMAL(6,2) NOT NULL,
    dilution_percent DECIMAL(5,2) NOT NULL,
    categories JSONB NOT NULL,
    total_weight DECIMAL(10,3),
    estimated_paint_volume DECIMAL(10,3),
    estimated_reducer_volume DECIMAL(10,3),
    estimated_paint_volume_by_area DECIMAL(10,3),
    estimated_reducer_volume_by_area DECIMAL(10,3),
    average_complexity DECIMAL(3,1),
    created_at TIMESTAMPTZ DEFAULT NOW(),
    updated_at TIMESTAMPTZ DEFAULT NOW()
);

-- Tabela instruments
CREATE TABLE IF NOT EXISTS gpi.instruments (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    organization_id UUID NOT NULL,
    name TEXT NOT NULL,
    type TEXT NOT NULL,
    serial_number TEXT,
    manufacturer TEXT,
    model TEXT,
    last_calibration DATE,
    next_calibration DATE,
    status TEXT DEFAULT 'active',
    notes TEXT,
    created_at TIMESTAMPTZ DEFAULT NOW(),
    updated_at TIMESTAMPTZ DEFAULT NOW()
);

-- Tabela stock_items
CREATE TABLE IF NOT EXISTS gpi.stock_items (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    organization_id UUID NOT NULL,
    name TEXT,
    type TEXT,
    batch_number TEXT,
    quantity DECIMAL(12,3) DEFAULT 0,
    unit TEXT DEFAULT 'L',
    data_sheet_id TEXT,
    location TEXT,
    expiration_date DATE,
    status TEXT DEFAULT 'available',
    notes TEXT,
    created_at TIMESTAMPTZ DEFAULT NOW(),
    updated_at TIMESTAMPTZ DEFAULT NOW()
);

-- Tabela stock_movements
CREATE TABLE IF NOT EXISTS gpi.stock_movements (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    organization_id UUID NOT NULL,
    stock_item_id UUID REFERENCES gpi.stock_items(id) ON DELETE CASCADE,
    type TEXT NOT NULL CHECK (type IN ('in', 'out', 'adjustment')),
    quantity DECIMAL(10,3) NOT NULL,
    reason TEXT,
    performed_by TEXT,
    notes TEXT,
    created_at TIMESTAMPTZ DEFAULT NOW()
);

-- Tabela notifications
CREATE TABLE IF NOT EXISTS gpi.notifications (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    organization_id UUID NOT NULL,
    title TEXT NOT NULL,
    message TEXT NOT NULL,
    type TEXT DEFAULT 'info' CHECK (type IN ('info', 'warning', 'error', 'success')),
    is_read BOOLEAN DEFAULT false,
    is_archived BOOLEAN DEFAULT false,
    archived_by TEXT[],
    deleted_by TEXT[],
    metadata JSONB,
    created_at TIMESTAMPTZ DEFAULT NOW()
);

-- Tabela geometry_types
CREATE TABLE IF NOT EXISTS gpi.geometry_types (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    organization_id UUID NOT NULL,
    name TEXT NOT NULL,
    efficiency_loss DECIMAL(5,2),
    updated_at TIMESTAMPTZ DEFAULT NOW()
);

-- Tabela messages
CREATE TABLE IF NOT EXISTS gpi.messages (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    organization_id UUID NOT NULL,
    from_user_id UUID,
    to_user_id UUID,
    message TEXT NOT NULL,
    is_read BOOLEAN DEFAULT false,
    read_at TIMESTAMPTZ,
    created_at TIMESTAMPTZ DEFAULT NOW(),
    updated_at TIMESTAMPTZ DEFAULT NOW()
);

-- Tabela stock_audit_logs
CREATE TABLE IF NOT EXISTS gpi.stock_audit_logs (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    organization_id UUID NOT NULL,
    stock_item_id TEXT,
    action TEXT NOT NULL,
    quantity_before DECIMAL(12,3),
    quantity_after DECIMAL(12,3),
    performed_by TEXT,
    details TEXT,
    created_at TIMESTAMPTZ DEFAULT NOW()
);

-- Tabela system_settings
CREATE TABLE IF NOT EXISTS gpi.system_settings (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    organization_id UUID NOT NULL,
    key TEXT UNIQUE NOT NULL,
    value JSONB,
    updated_at TIMESTAMPTZ DEFAULT NOW()
);

-- Tabela stored_files (Metadados dos PDFs)
CREATE TABLE IF NOT EXISTS gpi.stored_files (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    organization_id UUID NOT NULL,
    filename TEXT NOT NULL,
    mime_type TEXT,
    size_bytes BIGINT,
    storage_path TEXT, -- Caminho no Supabase Storage
    metadata JSONB,
    created_at TIMESTAMPTZ DEFAULT NOW()
);

-- Habilitar PostgREST para o schema gpi
GRANT USAGE ON SCHEMA gpi TO postgres, anon, authenticated, service_role;

-- Grant permissions em todas as tabelas
GRANT ALL ON TABLE gpi.organizations TO postgres, anon, authenticated, service_role;
GRANT ALL ON TABLE gpi.users TO postgres, anon, authenticated, service_role;
GRANT ALL ON TABLE gpi.projects TO postgres, anon, authenticated, service_role;
GRANT ALL ON TABLE gpi.parts TO postgres, anon, authenticated, service_role;
GRANT ALL ON TABLE gpi.painting_schemes TO postgres, anon, authenticated, service_role;
GRANT ALL ON TABLE gpi.application_records TO postgres, anon, authenticated, service_role;
GRANT ALL ON TABLE gpi.inspections TO postgres, anon, authenticated, service_role;
GRANT ALL ON TABLE gpi.technical_data_sheets TO postgres, anon, authenticated, service_role;
GRANT ALL ON TABLE gpi.yield_studies TO postgres, anon, authenticated, service_role;
GRANT ALL ON TABLE gpi.instruments TO postgres, anon, authenticated, service_role;
GRANT ALL ON TABLE gpi.stock_items TO postgres, anon, authenticated, service_role;
GRANT ALL ON TABLE gpi.stock_movements TO postgres, anon, authenticated, service_role;
GRANT ALL ON TABLE gpi.notifications TO postgres, anon, authenticated, service_role;
GRANT ALL ON TABLE gpi.geometry_types TO postgres, anon, authenticated, service_role;
GRANT ALL ON TABLE gpi.messages TO postgres, anon, authenticated, service_role;
GRANT ALL ON TABLE gpi.stock_audit_logs TO postgres, anon, authenticated, service_role;
GRANT ALL ON TABLE gpi.system_settings TO postgres, anon, authenticated, service_role;
GRANT ALL ON TABLE gpi.stored_files TO postgres, anon, authenticated, service_role;

-- Grant sequences
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA gpi TO postgres, anon, authenticated, service_role;

SELECT 'Schema gpi criado com sucesso!' AS result;