
import { Test, TestingModule } from "@nestjs/testing";
import { ConfigModule } from "@nestjs/config";
import { p3Values } from "point3-common-tool";

import { LogtoLoggerServiceToken, LogtoM2MClient, LogtoM2MClientToken, LogtoUser } from "..";
import { LogtoTokenVerifier, LogtoTokenVerifierToken } from "../../token";
import { ConsoleLogger } from "@nestjs/common";

describe('M2mclient를 이용한 Logto API 테스트', () => {
    let m2mClient: LogtoM2MClient;
    let testUser: LogtoUser;
    let testUserId: string = 'bead71jr45u1';
    let testRoleId: string = '0fwcgs8okjy7lav216sb3';
    beforeAll(async () => {
        const module: TestingModule = await Test.createTestingModule({
            imports: [
                ConfigModule.forRoot({
                    envFilePath: `env/.env.${process.env.NODE_ENV}`,
                    isGlobal: true,
                })
            ],
            providers: [
                {
                    provide: LogtoTokenVerifierToken,
                    useClass: LogtoTokenVerifier
                },
                {
                    provide: LogtoLoggerServiceToken,
                    useClass: ConsoleLogger
                }
            ],
        }).compile();
        m2mClient = module.get<LogtoM2MClient>(LogtoM2MClientToken);

        // random number 4 자리
        const randomNumber = Math.floor(1000 + Math.random() * 9000);
        testUser = {
            username: p3Values.Guid.create('test').toString().replace(/-/g, '_'), // '01958ea8-8a60-7c41-bef2-f6ed8d2d5506'
            name: 'test' + randomNumber,
            primaryEmail: 'test' + randomNumber + '@test.com',
            password: 'test123',
            primaryPhone: '0101111' + randomNumber,
        };
    });

    it('유저 생성', async () => {
        const userId = await m2mClient.createUser(testUser);
        expect(userId).toBeDefined();
        testUserId = userId;
    });

    it('토큰 발급', async () => {
        await m2mClient.fetchAccessToken();
    });

    it('PAT 추가 및 삭제', async () => {
        const tokenName = 'test_pat_' + Math.floor(1000 + Math.random() * 9000);
        
        // 발급 테스트
        const newToken = await m2mClient.addPersonalAccessToken(testUserId, tokenName, 3600);
        expect(newToken).toBeDefined();
        expect(newToken.name).toBe(tokenName);
        
        // 조회 테스트 (추가되었는지 확인)
        const tokens = await m2mClient.getPersonalAccessTokens(testUserId);
        const foundToken = tokens.find(t => t.name === tokenName);
        expect(foundToken).toBeDefined();
        
        // 삭제 테스트
        await m2mClient.deletePersonalAccessToken(testUserId, tokenName);
        
        // 조회 테스트 (삭제되었는지 확인)
        const tokensAfterDelete = await m2mClient.getPersonalAccessTokens(testUserId);
        const deletedToken = tokensAfterDelete.find(t => t.name === tokenName);
        expect(deletedToken).toBeUndefined();
    });

    it('유저 정보 수정', async () => {
        await m2mClient.updateUserClientInfo(testUserId);
    });
});