CREATE DATABASE IF NOT EXISTS openpanel;

CREATE TABLE IF NOT EXISTS openpanel.events (
  `id` UUID DEFAULT generateUUIDv4(),
  `name` String,
  `device_id` String,
  `profile_id` String,
  `project_id` String,
  `session_id` String,
  `path` String,
  `origin` String,
  `referrer` String,
  `referrer_name` String,
  `referrer_type` String,
  `duration` UInt64,
  `properties` Map(String, String),
  `created_at` DateTime64(3),
  `country` String,
  `city` String,
  `region` String,
  `longitude` Nullable(Float32),
  `latitude` Nullable(Float32),
  `os` String,
  `os_version` String,
  `browser` String,
  `browser_version` String,
  -- device: mobile/desktop/tablet
  `device` String,
  -- brand: (Samsung, OnePlus)
  `brand` String,
  -- model: (Samsung Galaxy, iPhone X)
  `model` String
) ENGINE MergeTree
ORDER BY
  (project_id, created_at, profile_id) SETTINGS index_granularity = 8192;

CREATE TABLE IF NOT EXISTS openpanel.events_v2 (
  `id` UUID DEFAULT generateUUIDv4(),
  `name` String,
  `device_id` String,
  `profile_id` String,
  `project_id` String,
  `session_id` String,
  `path` String,
  `origin` String,
  `referrer` String,
  `referrer_name` String,
  `referrer_type` String,
  `duration` UInt64,
  `properties` Map(String, String),
  `created_at` DateTime64(3),
  `country` String,
  `city` String,
  `region` String,
  `longitude` Nullable(Float32),
  `latitude` Nullable(Float32),
  `os` String,
  `os_version` String,
  `browser` String,
  `browser_version` String,
  -- device: mobile/desktop/tablet
  `device` String,
  -- brand: (Samsung, OnePlus)
  `brand` String,
  -- model: (Samsung Galaxy, iPhone X)
  `model` String
) ENGINE = MergeTree() PARTITION BY toYYYYMM(created_at)
ORDER BY
  (project_id, created_at, profile_id) SETTINGS index_granularity = 8192;

ALTER TABLE
  events DROP COLUMN utm_source,
  DROP COLUMN utm_medium,
  DROP COLUMN utm_campaign,
  DROP COLUMN utm_term,
  DROP COLUMN utm_content,
  DROP COLUMN sdk,
  DROP COLUMN sdk_version,
  DROP COLUMN client_type,
  DROP COLUMN continent;

CREATE TABLE IF NOT EXISTS openpanel.events_bots (
  `id` UUID DEFAULT generateUUIDv4(),
  `project_id` String,
  `name` String,
  `type` String,
  `path` String,
  `created_at` DateTime64(3),
) ENGINE MergeTree
ORDER BY
  (project_id, created_at) SETTINGS index_granularity = 8192;

CREATE TABLE IF NOT EXISTS openpanel.profiles (
  `id` String,
  `first_name` String,
  `last_name` String,
  `email` String,
  `avatar` String,
  `properties` Map(String, String),
  `project_id` String,
  `created_at` DateTime
) ENGINE = ReplacingMergeTree(created_at)
ORDER BY
  (id) SETTINGS index_granularity = 8192;

--- Materialized views (DAU)
CREATE MATERIALIZED VIEW IF NOT EXISTS dau_mv ENGINE = AggregatingMergeTree() PARTITION BY toYYYYMMDD(date)
ORDER BY
  (project_id, date) POPULATE AS
SELECT
  toDate(created_at) as date,
  uniqState(profile_id) as profile_id,
  project_id
FROM
  events
GROUP BY
  date,
  project_id;