import { Action } from '@ngrx/store';

import { RESTClientError } from '@loafer/ng-rest/protocol';

import { Member } from '@overflow/commons-typescript/model/member';

export enum ActionType {
  CreateTotp                = '[member.totp] CreateTotp',
  CreateTotpSuccess         = '[member.totp] CreateTotpSuccess',
  CreateTotpFailure         = '[member.totp] CreateTotpFailure',

  Regist                    = '[member.totp] Regist',
  RegistSuccess             = '[member.totp] RegistSuccess',
  RegistFailure             = '[member.totp] RegistFailure',

  CheckCodeForMember        = '[member.totp] CheckCodeForMember',
  CheckCodeForMemberSuccess = '[member.totp] CheckCodeForMemberSuccess',
  CheckCodeForMemberFailure = '[member.totp] CheckCodeForMemberFailure',
}

export class CreateTotp implements Action {
  readonly type = ActionType.CreateTotp;

  constructor(public payload: Member) {}
}

export class CreateTotpSuccess implements Action {
  readonly type = ActionType.CreateTotpSuccess;

  constructor(public payload: {key: string, uri: string}) {}
}

export class CreateTotpFailure implements Action {
  readonly type = ActionType.CreateTotpFailure;

  constructor(public payload: RESTClientError) {}
}

// ----------------------------------------------------------------------------------------

export class Regist implements Action {
  readonly type = ActionType.Regist;

  constructor(public payload: {member: Member, secretCode: string, code: string}) {}
}

export class RegistSuccess implements Action {
  readonly type = ActionType.RegistSuccess;

  constructor(public payload: void) {}
}

export class RegistFailure implements Action {
  readonly type = ActionType.RegistFailure;

  constructor(public payload: RESTClientError) {}
}

// ----------------------------------------------------------------------------------------

export class CheckCodeForMember implements Action {
  readonly type = ActionType.CheckCodeForMember;

  constructor(public payload: {member: Member, code: string}) {}
}

export class CheckCodeForMemberSuccess implements Action {
  readonly type = ActionType.CheckCodeForMemberSuccess;

  constructor(public payload: void) {}
}

export class CheckCodeForMemberFailure implements Action {
  readonly type = ActionType.CheckCodeForMemberFailure;

  constructor(public payload: RESTClientError) {}
}

export type Actions =
  | CreateTotp
  | CreateTotpSuccess
  | CreateTotpFailure
  | Regist
  | RegistSuccess
  | RegistFailure
  | CheckCodeForMember
  | CheckCodeForMemberSuccess
  | CheckCodeForMemberFailure
  ;
