import { BVAS_GEOGRAPHY_FILTERS } from './bvasInfo';
import { isRecord } from './users';

export interface BvasReport1 {
  [field: string]: string | number | null;
  id: string;
  geozone_id: string | null;
  state_id: string | null;
  lga_id: string | null;
  ward_id: string | null;
  pu_id: string | null;
  note: string | null;
  updated_at: string;
  image: string | null;
}

export interface BvasReport1Page {
  data: BvasReport1[];
  meta: { current_page: number; last_page: number; per_page: number; total: number };
}

const PARTY_FIELDS = ['a', 'aa', 'adp', 'app', 'aac', 'adc', 'apc', 'apga', 'apm', 'bp', 'dla', 'lp', 'ndp', 'nrm', 'nnpp', 'ndc', 'pdp', 'prp', 'sdp', 'ypp', 'yp', 'zlp'];

export function isBvasReport1(value: unknown): value is BvasReport1 {
  return isRecord(value) && typeof value.id === 'string' && value.id.length > 0 &&
    BVAS_GEOGRAPHY_FILTERS.every((field) => value[field] === null || typeof value[field] === 'string') &&
    (value.note === null || typeof value.note === 'string') && typeof value.updated_at === 'string' &&
    (value.image === null || typeof value.image === 'string') &&
    PARTY_FIELDS.every((field) => typeof value[field] === 'number' && Number.isSafeInteger(value[field]) && value[field] >= 0) &&
    Object.values(value).every((field) => field === null || typeof field === 'string' ||
      (typeof field === 'number' && Number.isSafeInteger(field) && field >= 0));
}

export function isBvasReport1Page(value: unknown): value is BvasReport1Page {
  if (!isRecord(value) || !Array.isArray(value.data) || !value.data.every(isBvasReport1) || !isRecord(value.meta)) return false;
  const meta = value.meta;
  return ['current_page', 'last_page', 'per_page'].every((field) =>
    typeof meta[field] === 'number' && Number.isSafeInteger(meta[field]) && meta[field] >= 1) &&
    typeof meta.total === 'number' && Number.isSafeInteger(meta.total) && meta.total >= 0;
}

export function bvasReport1Counts(report: BvasReport1) {
  return Object.entries(report).filter((entry): entry is [string, number] => PARTY_FIELDS.includes(entry[0]) && typeof entry[1] === 'number');
}
