import { PublicUser } from "@spacebar/schemas";
import { Member } from "@spacebar/util";

export interface ChannelOverride {
    message_notifications: number;
    mute_config: MuteConfig;
    muted: boolean;
    channel_id: string | null;
}

export interface UserGuildSettings {
    // channel_overrides: {
    // 	channel_id: string;
    // 	message_notifications: number;
    // 	mute_config: MuteConfig;
    // 	muted: boolean;
    // }[];

    channel_overrides: {
        [channel_id: string]: ChannelOverride;
    } | null;
    message_notifications: number;
    mobile_push: boolean;
    mute_config: MuteConfig | null;
    muted: boolean;
    suppress_everyone: boolean;
    suppress_roles: boolean;
    version: number;
    guild_id: string | null;
    flags: number;
    mute_scheduled_events: boolean;
    hide_muted_channels: boolean;
    notify_highlights: 0;
}

export const DefaultUserGuildSettings: UserGuildSettings = {
    channel_overrides: null,
    message_notifications: 1,
    flags: 0,
    hide_muted_channels: false,
    mobile_push: true,
    mute_config: null,
    mute_scheduled_events: false,
    muted: false,
    notify_highlights: 0,
    suppress_everyone: false,
    suppress_roles: false,
    version: 453, // ?
    guild_id: null,
};

export interface MuteConfig {
    end_time: number;
    selected_time_window: number;
}

export type PublicMemberKeys =
    | "id"
    | "guild_id"
    | "nick"
    | "roles"
    | "joined_at"
    | "pending"
    | "deaf"
    | "mute"
    | "premium_since"
    | "avatar"
    | "banner"
    | "bio"
    | "theme_colors"
    | "pronouns"
    | "communication_disabled_until"
    | "flags";

export const PublicMemberProjection: PublicMemberKeys[] = [
    "id",
    "guild_id",
    "nick",
    "roles",
    "joined_at",
    "pending",
    "deaf",
    "mute",
    "premium_since",
    "avatar",
    "banner",
    "bio",
    "theme_colors",
    "pronouns",
    "communication_disabled_until",
    "flags",
];

export type PublicMember = Omit<Pick<Member, PublicMemberKeys>, "roles"> & {
    user: PublicUser;
    roles: string[]; // only role ids not objects
};
