-- Nova40 Database Schema
-- Run this in your Supabase SQL editor

-- Enable UUID extension
create extension if not exists "uuid-ossp";

-- 1. Identities table
create table identities (
  id uuid default uuid_generate_v4() primary key,
  user_id uuid references auth.users(id) on delete cascade not null,
  title text not null,
  description text,
  start_date date not null,
  end_date date not null,
  created_at timestamptz default now()
);

alter table identities enable row level security;

create policy "Users can view their own identities"
  on identities for select using (auth.uid() = user_id);

create policy "Users can create their own identities"
  on identities for insert with check (auth.uid() = user_id);

-- 2. Habits table
create table habits (
  id uuid default uuid_generate_v4() primary key,
  identity_id uuid references identities(id) on delete cascade not null,
  title text not null,
  description text
);

alter table habits enable row level security;

create policy "Users can view habits for their identities"
  on habits for select using (
    identity_id in (select id from identities where user_id = auth.uid())
  );

create policy "Users can create habits for their identities"
  on habits for insert with check (
    identity_id in (select id from identities where user_id = auth.uid())
  );

-- 3. Daily logs table
create table daily_logs (
  id uuid default uuid_generate_v4() primary key,
  identity_id uuid references identities(id) on delete cascade not null,
  date date not null,
  day_number int not null,
  identity_check text check (identity_check in ('yes', 'almost', 'no')),
  note text,
  unique (identity_id, date)
);

alter table daily_logs enable row level security;

create policy "Users can view their daily logs"
  on daily_logs for select using (
    identity_id in (select id from identities where user_id = auth.uid())
  );

create policy "Users can insert daily logs"
  on daily_logs for insert with check (
    identity_id in (select id from identities where user_id = auth.uid())
  );

create policy "Users can update their daily logs"
  on daily_logs for update using (
    identity_id in (select id from identities where user_id = auth.uid())
  );

-- 4. Habit logs table
create table habit_logs (
  id uuid default uuid_generate_v4() primary key,
  habit_id uuid references habits(id) on delete cascade not null,
  date date not null,
  completed boolean default false,
  unique (habit_id, date)
);

alter table habit_logs enable row level security;

create policy "Users can view their habit logs"
  on habit_logs for select using (
    habit_id in (
      select h.id from habits h
      join identities i on h.identity_id = i.id
      where i.user_id = auth.uid()
    )
  );

create policy "Users can insert habit logs"
  on habit_logs for insert with check (
    habit_id in (
      select h.id from habits h
      join identities i on h.identity_id = i.id
      where i.user_id = auth.uid()
    )
  );

create policy "Users can update their habit logs"
  on habit_logs for update using (
    habit_id in (
      select h.id from habits h
      join identities i on h.identity_id = i.id
      where i.user_id = auth.uid()
    )
  );

-- 5. Game sessions table
create table game_sessions (
  id uuid default uuid_generate_v4() primary key,
  identity_id uuid references identities(id) on delete cascade not null,
  game_type text not null,
  score int default 0,
  created_at timestamptz default now()
);

alter table game_sessions enable row level security;

create policy "Users can view their game sessions"
  on game_sessions for select using (
    identity_id in (select id from identities where user_id = auth.uid())
  );

create policy "Users can insert game sessions"
  on game_sessions for insert with check (
    identity_id in (select id from identities where user_id = auth.uid())
  );

-- 6. Stats table
create table stats (
  id uuid default uuid_generate_v4() primary key,
  identity_id uuid references identities(id) on delete cascade not null unique,
  discipline_score int default 0,
  focus_score int default 0,
  consistency_score int default 0
);

alter table stats enable row level security;

create policy "Users can view their stats"
  on stats for select using (
    identity_id in (select id from identities where user_id = auth.uid())
  );

create policy "Users can insert their stats"
  on stats for insert with check (
    identity_id in (select id from identities where user_id = auth.uid())
  );

create policy "Users can update their stats"
  on stats for update using (
    identity_id in (select id from identities where user_id = auth.uid())
  );
