import { isRecord } from './users';

export const MAX_VOTER_IMAGE_SIZE = 5120 * 1024;
export interface RegisteredVoter {
  id: string;
  geozone_id: number | string | null;
  state_id: number | string | null;
  lga_id: number | string | null;
  ward_id: number | string | null;
  pu_id: number | string | null;
  numbers: number;
  note: string | null;
  image: string | null;
  updated_at: string;
}
export interface RegisteredVoterPage {
  data: RegisteredVoter[];
  meta: { current_page: number; last_page: number; per_page: number; total: number };
}

export function validVoterCount(value: unknown): value is number {
  return typeof value === 'number' && Number.isInteger(value) && value >= 0 && value <= 4294967295;
}

export function isRegisteredVoter(value: unknown): value is RegisteredVoter {
  return isRecord(value) && typeof value.id === 'string' && value.id.length > 0 &&
    validVoterCount(value.numbers) && (value.note === null || typeof value.note === 'string') &&
    (value.image === null || typeof value.image === 'string') && typeof value.updated_at === 'string' &&
    ['geozone_id', 'state_id', 'lga_id', 'ward_id', 'pu_id'].every((key) =>
      value[key] === null || (typeof value[key] === 'string' && value[key].length > 0) ||
      (typeof value[key] === 'number' && Number.isSafeInteger(value[key]) && value[key] >= 0));
}

export function isRegisteredVoterPage(value: unknown): value is RegisteredVoterPage {
  if (!isRecord(value) || !Array.isArray(value.data) || !value.data.every(isRegisteredVoter) || !isRecord(value.meta)) return false;
  const meta = value.meta;
  return ['current_page', 'last_page', 'per_page'].every((key) =>
    typeof meta[key] === 'number' && Number.isSafeInteger(meta[key]) && meta[key] >= 1) &&
    typeof meta.total === 'number' && Number.isSafeInteger(meta.total) && meta.total >= 0;
}

export function voterImageType(bytes: Uint8Array): string | null {
  if (bytes[0] === 0xff && bytes[1] === 0xd8 && bytes[2] === 0xff) return 'image/jpeg';
  if ([137, 80, 78, 71, 13, 10, 26, 10].every((byte, index) => bytes[index] === byte)) return 'image/png';
  const prefix = String.fromCharCode(...Array.from(bytes.slice(0, 12)));
  if (prefix.startsWith('GIF87a') || prefix.startsWith('GIF89a')) return 'image/gif';
  if (prefix.startsWith('RIFF') && prefix.slice(8) === 'WEBP') return 'image/webp';
  return null;
}
