import { eq, sql } from 'drizzle-orm';
import { users } from '@/server/db/schema';
import type { KnowledgeAdapter, KnowledgeChunk } from './types';
import type { AdapterContext } from '@/server/support/types';

const LABEL = 'פרופיל משתמש';

function accountAgeDays(createdAt: Date): number {
  return Math.floor((Date.now() - createdAt.getTime()) / (1000 * 60 * 60 * 24));
}

export const userProfileAdapter: KnowledgeAdapter = {
  id: 'user-profile',
  label: LABEL,
  description: 'פרטי חשבון וגיל חשבון של הפונה',
  async fetch(ctx: AdapterContext): Promise<KnowledgeChunk> {
    const base: KnowledgeChunk = {
      adapterId: 'user-profile',
      label: LABEL,
      data: {},
      summary: '',
    };

    try {
      const piiKey = ctx.env.PII_KEY;
      const [row] = await ctx.db
        .select({
          displayName: users.displayName,
          createdAt: users.createdAt,
          emailVerifiedAt: users.emailVerifiedAt,
          phoneHint: users.phoneHint,
          email: piiKey
            ? sql<
                string | null
              >`pgp_sym_decrypt(CASE WHEN substring(${users.email}, 1, 2) = '\\x' THEN ${users.email}::bytea ELSE decode(${users.email}, 'base64') END, ${piiKey})::text`
            : sql<string | null>`NULL::text`,
          phone: piiKey
            ? sql<
                string | null
              >`pgp_sym_decrypt(CASE WHEN substring(${users.phone}, 1, 2) = '\\x' THEN ${users.phone}::bytea ELSE decode(${users.phone}, 'base64') END, ${piiKey})::text`
            : sql<string | null>`NULL::text`,
        })
        .from(users)
        .where(eq(users.id, ctx.userId))
        .limit(1);

      if (!row) {
        return { ...base, summary: 'משתמש לא נמצא' };
      }

      const ageDays = accountAgeDays(row.createdAt);
      const name = row.displayName ?? 'ללא שם';
      const data = {
        displayName: row.displayName,
        email: row.email,
        phone: row.phone,
        phoneHint: row.phoneHint,
        createdAt: row.createdAt.toISOString(),
        emailVerified: row.emailVerifiedAt !== null,
        accountAgeDays: ageDays,
      };

      return {
        ...base,
        data,
        summary: `${name}, חשבון בן ${ageDays} ימים${row.emailVerifiedAt ? ', אימייל מאומת' : ''}`,
      };
    } catch (err) {
      return { ...base, error: String(err) };
    }
  },
};
