DROP TRIGGER IF EXISTS add_current_user_to_new_account ON medreport.accounts;

create or replace function medreport.create_team_account (
    account_name text,
    new_personal_code text
) returns medreport.accounts
    security definer
    set search_path = ''
as $$
declare
    existing_account medreport.accounts;
    current_user uuid := (select auth.uid())::uuid;
    new_account medreport.accounts;
begin
    if not medreport.is_set('enable_team_accounts') then
        raise exception 'Team accounts are not enabled';
    end if;

    insert into medreport.accounts(
        name,
        is_personal_account)
    values (
               account_name,
               false)
    returning
        * into new_account;

    -- Try to find existing account
    select *
    into existing_account
    from medreport.accounts
    where personal_code = new_personal_code
    limit 1;

    -- If not found, fail
    if not found then
        raise exception 'No account found with personal_code = %', new_personal_code;
    end if;

    -- Insert membership
    insert into medreport.accounts_memberships (
        user_id,
        account_id,
        account_role,
        created_by,
        updated_by,
        created_at,
        updated_at,
        has_seen_confirmation
    )
    values (
        existing_account.id,
        new_account.id,
        'owner',
        null,
        null,
        now(),
        now(),
        false
    )
    on conflict do nothing;

    return new_account;
end;
$$ language plpgsql;

grant execute on function medreport.create_team_account (text, text) to authenticated, service_role;
