import { test } from '@japa/runner';
import supertest from 'supertest';
import Database from '@ioc:Adonis/Lucid/Database';
import Dataset from 'App/Models/Dataset';
import server from '@ioc:Adonis/Core/Server'; // Import the server instance
import User from 'App/Models/User';

test.group('DatasetController', (group) => {
    // Write your test here
    // beforeEach(async () => {
    //     await Database.beginGlobalTransaction();
    // });
    // In the following example, we start a global transaction before all the tests and roll back it after the tests.
    group.each.setup(async () => {
        await Database.beginGlobalTransaction();
        return () => Database.rollbackGlobalTransaction();
    });

    test('should render dataset release page', async ({ assert }) => {
        // var agent = supertest(server.instance);

        // const user = await loginUser(agent);
        const user = await User.create({
            login: 'test',
            email: 'alice@email.com',
            password: 'password',
        });

        const dataset = new Dataset();
        dataset.type = 'analysisdata';
        dataset.creatingCorporation = 'Tethys RDR';
        dataset.language = 'de';
        dataset.server_state = 'inprogress'; // Set the desired server state here
        await dataset.save();

        await user.related('datasets').save(dataset);

        // Perform the login request to establish the session
        const loginResponse = await supertest(server.instance)
            .post('/app/login')
            // .field('email', user.email)
            // .field('password', user.password)
            // .set('Content-Type', 'application/x-www-form-urlencoded')
            .send({ email: user.email, password: 'password' })
            .set('Content-Type', 'application/json')
            .expect(302); // Assuming the login endpoint redirects, if succesful
        // Extract the session cookies from the login response
        assert.exists(loginResponse.headers['set-cookie']);
        const cookie = loginResponse.headers['set-cookie'];

        // const response = await supertest(server.instance).get(`/submitter/dataset/${dataset.id}/release`).expect(302); //302 if authenticated, else 200
        const response = await supertest(server.instance)
            .get(`/submitter/dataset/${dataset.id}/release`)
            .set('Cookie', cookie)
            .set('X-Requested-With', 'XMLHttpRequest') // Set the X-Requested-With header to mimic an AJAX request
            .set('X-Inertia', 'true')
            // .set('X-Inertia-Version', '97c0899ca6e04e77a69f1ad5320e4ebe')
            .set('Accept', 'text/html, application/xhtml+xml')
            .set('Accept-Encoding', 'gzip, deflate, br')
            .set('Connection', 'keep-alive')
            .set(
                'User-Agent',
                'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
            )
            .set('Host', 'localhost:4001')
            // .set('Referer', 'http://localhost:3333/submitter/dataset')
            // .set('Authorization', `Bearer ${authToken}`) // Set the Authorization header with the authentication token            .

            .expect(200);

        // assert.equal(response.statusCode, 302);

        // Add more assertions based on the expected behavior
        // assert.equal(response.header('X-Inertia'), 'true');
        // assert.equal(response.header('Content-Type'), 'application/json');
        assert.equal(response.headers['x-inertia'], 'true');
        assert.equal(response.headers['content-type'], 'application/json; charset=utf-8');

        const responseData = response.body as { component: string; props: { dataset: any }; url: string };
        // assert.equal(responseData.component, 'DatasetReleasePage');
        assert.equal(responseData.props.dataset.id, dataset.id);
    });
});
