import { TeamsApi } from '../../api/teamsApi';
import { CreateTeamRequest, TeamListResponse, TeamUpdateRequest } from '../../model';
import config from '../config';
 
describe('TeamsTestcase', () => {
let teamsApi:TeamsApi;
let createdTeamId:any
let teamName:any
const randomNumbers = () => {
const randomNum = Math.floor(100 + Math.random() * 900);
return String(randomNum);
};
beforeAll(() => {
    createdTeamId = null;
    teamName = null;
    const apiKey = config.apiKey;
    const baseUrl = config.baseUrl;
    if (!apiKey || !baseUrl) {
        throw new Error("Environment variables 'API_KEY' or 'HOST_URL' are not set.");
    }
    teamsApi = new TeamsApi(baseUrl);
    teamsApi.setApiKey(apiKey);
    teamName = `sdktestingteam${randomNumbers()}`;
});
test('Test1: should create team successfully', async () => {
    const createTeamRequest = new CreateTeamRequest();
    createTeamRequest.teamName = teamName;
    try {
        const createTeamResponse = await teamsApi.createTeam(createTeamRequest);
        console.log('Team created successfully:', createTeamResponse);
        const createdTeam = createTeamResponse?.teamId;
        if (createdTeam && createdTeam) {
            createdTeamId = String(createdTeam);
            console.log('Created Team ID:', createdTeamId);
        } else {
            console.error('Team ID not found in response.');
            throw new Error('Team creation failed.');
        }
        expect(createTeamResponse.teamId).toBeDefined;
        console.log('Created Team ID:', createdTeamId);
    } catch (error:any) {
        console.error('Error occurred while creating team:', error.message);
        expect(error.message).toBeUndefined();
    }
},20000);
test('Test2: should return error when team name already exists', async () => {
    const createTeamRequest = new CreateTeamRequest();
    createTeamRequest.teamName = teamName;
    try {
        const response = await teamsApi.createTeam(createTeamRequest);
        console.log('Team created successfully:', response);
    } catch (error: any) {
        console.error('Error occurred while creating team:', error.message);
        expect(error.message).toBeDefined();
    }
},20000);
test('Test3: should return error when team name empty', async () => {
    const createTeamRequest = new CreateTeamRequest();
    createTeamRequest.teamName = "";
    try {
        const response = await teamsApi.createTeam(createTeamRequest);
        console.log('Team created successfully:', response);
    } catch (error: any) {
        console.error('Error occurred while creating team:', error);
        expect(error).toBeDefined();
        expect(error.response.status).toBe(400);
        expect(error.response.statusText).toBe('Bad Request');
    }
},20000);
test('Test4: should successfully retrieve team list with valid parameters', async () => {
    const page = 1;
    const pageSize = 100;
    try {
        const teamListResponse = await teamsApi.listTeams(page, pageSize);
        expect(teamListResponse.results).toBeDefined;
        const teamsList = teamListResponse?.results;
        if (Array.isArray(teamsList)) {
            for (let team of teamsList) {
                if (team.teamName === teamName) {
                    createdTeamId = team.teamId;
                    console.log("Created Team ID:", createdTeamId);
                    break;
                }
            }
        } else {
            console.error("teamsList is not an array or is null/undefined.");
            throw new Error("teamsList is invalid.");
        }
        expect(createdTeamId !=null);
    } catch (error: any) {
        console.error("Error occurred while retrieving team list:", error.message);
        expect(error.message).toBeUndefined();
    }
},20000);
test('Test5:should fail to retrieve team list when invalid parameters are passed', async () => {
    const page = -1;
    const pageSize = -10;
    try {
        const teamListResponse = await teamsApi.listTeams(page, pageSize);
        console.error("Unexpected success response:", teamListResponse);
        throw new Error("Expected error, but API call succeeded");
    }
    catch (error:any)
    {
        console.log("Expected error occurred:", error.message);
        expect(error.message).toBeDefined();
    }
},20000);
test('Test6:should fail to retrieve team list when zero value for page and page size', async () => {
    const page = 0;
    const pageSize = 0;
    try {
        const teamListResponse = await teamsApi.listTeams(page, pageSize);
        console.error("Unexpected success response:", teamListResponse);
        throw new Error("Expected error, but API call succeeded");
    }
    catch (error:any)
    {
        console.log("Expected error occurred:", error);
        expect(error).toBeDefined();
        expect(error.response.status).toBe(400);
        expect(error.response.statusText).toBe('Bad Request');
    }
},20000);
test('Test7:should throw error for update when already existing team name is provided', async () => {
    const teamUpdateRequest = {
        teamId: createdTeamId,
        teamName: teamName,
    };
    try
    {
        await teamsApi.updateTeam(teamUpdateRequest);
    }
    catch (error:any)
    {
        expect(error).toBeDefined();
        expect(error.response.status).toBe(400);
        expect(error.response.statusText).toBe('Bad Request');
    }
},20000);
test('Test8:should return true when valid team update request is passed', async () => {
    const teamUpdateRequest = new TeamUpdateRequest();
    teamUpdateRequest.teamId = createdTeamId;
    teamUpdateRequest.teamName = "Update"+teamName;
    console.log("Teamid before update:",  createdTeamId);
    try
    {
        const records = await teamsApi.updateTeam(teamUpdateRequest);
        console.log("Team updated successfully:", records);
    }
    catch (error:any)
    {
        console.error("Error during team update:", error.message);
        expect(error.message).toBeUndefined();
    }
},20000);
test('Test9:should throw error for update when invalid team ID is provided', async () => {
    const teamUpdateRequest = {
        teamId: "wrongTeamId",
        teamName: teamName,
    };
    try
    {
        await teamsApi.updateTeam(teamUpdateRequest);
    }
    catch (error:any)
    {
        expect(error.message).toBeDefined();
    }
},20000);
test('Test10:should throw error for update when team name is empty', async () => {
    const teamUpdateRequest = {
        teamId: createdTeamId,
        teamName: "",
    };
    try
    {
        await teamsApi.updateTeam(teamUpdateRequest);
    }
    catch (error:any)
    {
        expect(error).toBeDefined();
        expect(error.response.status).toBe(400);
        expect(error.response.statusText).toBe('Bad Request');
    }
},20000);
test('Test11:should return true when valid team get request is passed', async () => {
    try
    {
        const records = await teamsApi.getTeam(createdTeamId);
        console.log(records);
        expect(records.teamName != null);
    }
    catch (error:any)
    {
        console.error("Error fetching team:", error.message);
        expect(error.message).toBeUndefined();
    }
},20000);
test('Test12:should throw error when invalid team ID is provided', async () => {
    const invalidTeamId = "INVALID_TEAMID";
    try
    {
        await teamsApi.getTeam(invalidTeamId);
    }
    catch (error:any)
    {
        console.log("Expected exception occurred " + error.message);
        expect(error).toBeDefined();
        expect(error.response.status).toBe(400);
        expect(error.response.statusText).toBe('Bad Request');
    }
},20000);
test('Test13:should throw error when team ID is empty', async () => {
    const invalidTeamId = "";
    try
    {
        await teamsApi.getTeam(invalidTeamId);
    }
    catch (error:any)
    {
        console.log("Expected exception occurred: " + error.message);
        expect(error.message).toBeDefined();
    }
},20000);
});