import { UPDATE, SET, CHANGE_LANG } from './actions';

export interface User {
  id: number | null;
  uuid: string | null;
  token: string;
  username: string;
  email: string;
  avatar: string;
  lang: string;
  isGuest: boolean;
  isActive: boolean;
  isOtpEnabled: boolean;
  passwordChangedAt: number;
  hasMojangUsernameCollision: boolean;
  maskedEmail?: string;
  shouldAcceptRules?: boolean;
}

export type State = {
  user: User;
};

const defaults: User = {
  id: null,
  uuid: null,
  username: '',
  token: '',
  email: '',
  // will contain user's email or masked email
  // (e.g. ex**ple@em*il.c**) depending on what information user have already provided
  maskedEmail: '',
  avatar: '',
  lang: '',
  isActive: false,
  isOtpEnabled: false,
  shouldAcceptRules: false, // whether user need to review updated rules
  passwordChangedAt: 0,
  hasMojangUsernameCollision: false,

  // frontend specific attributes
  isGuest: true,
};

export default function user(
  state: User = defaults,
  { type, payload }: { type: string; payload: any },
) {
  switch (type) {
    case CHANGE_LANG:
      if (!payload || !payload.lang) {
        throw new Error('payload.lang is required for user reducer');
      }

      return {
        ...state,
        lang: payload.lang,
      };

    case UPDATE:
      if (!payload) {
        throw new Error('payload is required for user reducer');
      }

      return {
        ...state,
        ...payload,
      };

    case SET:
      payload = payload || {};

      return {
        ...defaults,
        ...payload,
      };

    default:
      return (
        state || {
          ...defaults,
        }
      );
  }
}
