export interface Option {
  label: string;
  value: string;
}

/**
 * Интерфейс элемента сортировки.
 * Не позволяет использовать поля, которых нет в передаваемом интерфейсе.
 * @example SortingOption<SubpoenaListResponse>
 */
export interface SortingOption<T> {
  label: string;
  value: keyof T;
}

export interface Document {
  title: string;
  series: string;
  number: string;
  issueDate: string;
  issueOrg: string;
  issueOrgCode: string;
}

export interface List {
  id: string;
  number: number;
  title: string;
  createDate: string;
  status: string;
  recruits: Array<string>;
}
export type UrlQueryValue = string | string[] | undefined;
export type UrlQueryParams = {
  page?: string;
  perpage?: string;
  sortby?: string | undefined;
  descending?: string | undefined;
  search?: string | undefined;
  [key: string]: UrlQueryValue;
};

export class SearchFilter {
  search = '';

  public countFilters(): number {
    let filtersCount = 0;
    if (this.search) {
      filtersCount++;
    }
    return filtersCount;
  }

  public prepareRequestParams(): UrlQueryParams {
    return {
      search: this.search || undefined,
    };
  }

  public updateParamsFromRoute(query: UrlQueryParams): void {
    if (query.search) {
      this.search = String(query.search);
    }
  }
}

export interface RecruitSearchFilter {
  search: string;
  status: Array<Option>;
  birthDateFrom: Date | null;
  birthDateTo: Date | null;
  stopList: string;
}

export interface RegistrationSearchFilter {
  search: string;
  lastName: 'string' | null;
  firstName: 'string' | null;
  middleName: 'string' | null;
  birthDateFrom: Date | null;
  birthDateTo: Date | null;
  inn: number | null;
  snils: 'string' | null;
  idern: 'string' | null;
  documentType: Array<Option>;
  documentSeries: 'string' | null;
  documentNumber: 'string' | null;
  stopList: string;
}

export interface ListSearchFilter {
  search: string;
  status: Array<Option>;
  createDateFrom: Date | null;
  createDateTo: Date | null;
}

export const statusDictionary: { [key: string]: string } = {
  // статусы recruit-ов
  new: 'Новый',
  vk_relocation: 'Смена ВК',
  personal_file_requested: 'Запрос личного дела',
  personal_file_received: 'Получено личное дело',
  personal_file_extracted: 'Извлечено личное дело',
  registration_signing: 'На подписании',
  registered: 'Поставлен на учёт',
  attended: 'Явился',
  failed_to_attend: 'Не явился',
  note_sent: 'Повестка направлена',
  restrictions_imposed: 'Наложены временные меры',
  // статусы списков
  draft: 'Формируется',
  processed: 'Обработан',
  // статусы запросов ЛД
  requested: 'Новый запрос',
  received: 'Отправлено личное дело',
  rejected: 'Запрос отклонён',
  extracted: 'Извлечено личное дело',

  // статусы повесток
  GENERATED: 'Повестка сформирована',
  SENT: 'Повестка направлена',
  AWARDED: 'Повестка вручена',
  CANCELLED: 'Повестка аннулирована',
  COMPLETED: 'Явка по повестке осуществлена',
  NOT_COMPLETED: 'Явка по повестке не осуществлена',
};

export const sex: { [key: string]: string } = {
  MALE: 'Мужской',
  FEMALE: 'Женский',
};

export interface ResponseListAdd {
  successCol: number;
  errorsCol: number;
  listId: string;
  listNumber: number;
  listRecruit: {
    fullName: string;
    id: string;
    status: string;
  }[];
}

export interface UserTask {
  taskId?: string;
  defId?: string;
  procDefId?: string;
  formKey?: string;
  title?: string;
  createDate?: string;
  priority?: number;
  outData?: {
    actions?: string[];
    redirectToDocObject?: Record<string, string>;
  };
}
