<?php

namespace MintyPHP\Repository\User;

use MintyPHP\DB;

/** Links and looks up external identity provider accounts (Entra ID / OIDC) for users. */
class UserExternalIdentityRepository implements UserExternalIdentityRepositoryInterface
{
    private function unwrap($row): ?array
    {
        if (!$row || !is_array($row)) {
            return null;
        }
        if (isset($row['user_external_identities']) && is_array($row['user_external_identities'])) {
            return $row['user_external_identities'];
        }
        return $row;
    }

    public function findByProviderTidOid(string $provider, string $tid, string $oid): ?array
    {
        $row = DB::selectOne(
            'select id, user_id, provider, oid, tid, issuer, subject, email_at_link_time, created from user_external_identities where provider = ? and tid = ? and oid = ? limit 1',
            $provider,
            $tid,
            $oid
        );
        return $this->unwrap($row);
    }

    public function findByProviderIssuerSubject(string $provider, string $issuer, string $subject): ?array
    {
        $row = DB::selectOne(
            'select id, user_id, provider, oid, tid, issuer, subject, email_at_link_time, created from user_external_identities where provider = ? and issuer = ? and subject = ? limit 1',
            $provider,
            $issuer,
            $subject
        );
        return $this->unwrap($row);
    }

    public function createLink(array $data): mixed
    {
        return DB::insert(
            'insert into user_external_identities (user_id, provider, oid, tid, issuer, subject, email_at_link_time, created) values (?,?,?,?,?,?,?,NOW())',
            (string) ((int) ($data['user_id'] ?? 0)),
            (string) ($data['provider'] ?? ''),
            (string) ($data['oid'] ?? ''),
            (string) ($data['tid'] ?? ''),
            (string) ($data['issuer'] ?? ''),
            (string) ($data['subject'] ?? ''),
            $data['email_at_link_time'] ?? null
        );
    }
}
