import { describe, expect, it, LokaliseApi, Stub } from "../setup.js";

describe("Projects", () => {
	const lokaliseApi = new LokaliseApi({ apiKey: process.env.API_KEY });
	const projectId = "803826145ba90b42d5d860.46800099";
	const newProjectId = "43820238650c56462a27f0.61419394";

	it("lists", async () => {
		const stub = new Stub({
			fixture: "projects/list.json",
			uri: "projects",
			respHeaders: {
				"x-pagination-total-count": "2",
				"x-pagination-page": "1",
				"x-pagination-limit": "500",
				"x-pagination-page-count": "1",
			},
		});

		await stub.setStub();

		const projects = await lokaliseApi.projects().list();

		expect(projects.items[0].name).to.eq("Angular");
	});

	it("lists and paginates", async () => {
		const params = {
			page: 2,
			limit: 1,
		};

		const stub = new Stub({
			fixture: "projects/list_pagination.json",
			uri: "projects",
			query: params,
			respHeaders: {
				"x-pagination-total-count": "2",
				"x-pagination-page": "2",
				"x-pagination-limit": "1",
				"x-pagination-page-count": "2",
			},
		});

		await stub.setStub();

		const projects = await lokaliseApi.projects().list(params);

		expect(projects.items[0].name).to.eq("Blog");
		expect(projects.totalResults).to.eq(2);
		expect(projects.totalPages).to.eq(2);
		expect(projects.resultsPerPage).to.eq(1);
		expect(projects.currentPage).to.eq(2);
	});

	it("retrieves", async () => {
		const stub = new Stub({
			fixture: "projects/retrieve.json",
			uri: `projects/${projectId}`,
		});

		await stub.setStub();

		const project = await lokaliseApi.projects().get(projectId);

		expect(project.name).to.eq("Demo Phoenix");
		expect(project.project_id).to.equal(projectId);
		expect(project.project_type).to.equal("localization_files");
		expect(project.description).to.include("Description Phoenix");
		expect(project.created_at).to.equal("2018-09-24 16:05:22 (Etc/UTC)");
		expect(project.created_at_timestamp).to.equal(1537805122);
		expect(project.created_by).to.equal(20181);
		expect(project.created_by_email).to.equal("bodrovis@protonmail.com");
		expect(project.team_id).to.equal(176692);
		expect(project.team_uuid).to.equal("9ef160a0-d4c7-45f5-ab80-bc9e22e95b12");
		expect(project.base_language_id).to.equal(640);
		expect(project.base_language_iso).to.equal("en");
		expect(project.settings.per_platform_key_names).to.be.true;
		expect(project.statistics.progress_total).to.equal(32);
	});

	it("creates", async () => {
		const params = {
			name: "Node.js test",
			description: "Test description",
		};

		const stub = new Stub({
			fixture: "projects/create.json",
			uri: "projects",
			method: "POST",
			body: params,
		});

		await stub.setStub();

		const project = await lokaliseApi.projects().create(params);

		expect(project.project_id).to.equal(newProjectId);
		expect(project.name).to.equal("Node.js test");
		expect(project.description).to.equal("Test description");
	});

	it("updates", async () => {
		const params = {
			name: "Node.js updated",
			description: "Test description updated",
		};

		const stub = new Stub({
			fixture: "projects/update.json",
			uri: `projects/${newProjectId}`,
			method: "PUT",
			body: params,
		});

		await stub.setStub();

		const project = await lokaliseApi.projects().update(newProjectId, params);

		expect(project.project_id).to.equal(newProjectId);
		expect(project.name).to.equal(params.name);
		expect(project.description).to.equal(params.description);
	});

	it("empties", async () => {
		const stub = new Stub({
			fixture: "projects/empty.json",
			uri: `projects/${newProjectId}/empty`,
			method: "PUT",
		});

		await stub.setStub();

		const response = await lokaliseApi.projects().empty(newProjectId);

		expect(response.project_id).to.equal(newProjectId);
		expect(response.keys_deleted).to.be.true;
	});

	it("deletes", async () => {
		const stub = new Stub({
			fixture: "projects/delete.json",
			uri: `projects/${newProjectId}`,
			method: "DELETE",
		});

		await stub.setStub();

		const response = await lokaliseApi.projects().delete(newProjectId);

		expect(response.project_id).to.be.equal(newProjectId);
		expect(response.project_deleted).to.be.true;
	});
});
