/*
 * Copyright (c) 2018 Intel Corporation.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <ztest.h>
#include <string.h>
#include <zephyr/fs/fs.h>
#include "test_common.h"

int test_file_open(struct fs_file_t *filep, const char *file_path)
{
	int res;

	TC_PRINT("\nOpen tests:\n");

	if (check_file_dir_exists(file_path)) {
		TC_PRINT("Opening existing file %s\n", file_path);
	} else {
		TC_PRINT("Creating new file %s\n", file_path);
	}

	/* Verify fs_open() */
	res = fs_open(filep, file_path, FS_O_CREATE | FS_O_RDWR);
	if (res) {
		TC_PRINT("Failed opening file [%d]\n", res);
		return res;
	}

	TC_PRINT("Opened file %s\n", file_path);

	return res;
}

int test_file_write(struct fs_file_t *filep, const char *test_str)
{
	ssize_t brw;
	int res;

	TC_PRINT("\nWrite tests:\n");

	/* Verify fs_seek() */
	res = fs_seek(filep, 0, FS_SEEK_SET);
	if (res) {
		TC_PRINT("fs_seek failed [%d]\n", res);
		fs_close(filep);
		return res;
	}

	TC_PRINT("Data written:\"%s\"\n\n", test_str);

	/* Verify fs_write() */
	brw = fs_write(filep, (char *)test_str, strlen(test_str));
	if (brw < 0) {
		TC_PRINT("Failed writing to file [%zd]\n", brw);
		fs_close(filep);
		return brw;
	}

	if (brw < strlen(test_str)) {
		TC_PRINT("Unable to complete write. Volume full.\n");
		TC_PRINT("Number of bytes written: [%zd]\n", brw);
		fs_close(filep);
		return TC_FAIL;
	}

	TC_PRINT("Data successfully written!\n");

	return res;
}

int test_file_read(struct fs_file_t *filep, const char *test_str)
{
	ssize_t brw;
	int res;
	char read_buff[80];
	size_t sz = strlen(test_str);

	TC_PRINT("\nRead tests:\n");

	res = fs_seek(filep, 0, FS_SEEK_SET);
	if (res) {
		TC_PRINT("fs_seek failed [%d]\n", res);
		fs_close(filep);
		return res;
	}

	/* Verify fs_read() */
	brw = fs_read(filep, read_buff, sz);
	if (brw < 0) {
		TC_PRINT("Failed reading file [%zd]\n", brw);
		fs_close(filep);
		return brw;
	}

	read_buff[brw] = 0;

	TC_PRINT("Data read:\"%s\"\n\n", read_buff);

	if (strcmp(test_str, read_buff)) {
		TC_PRINT("Error - Data read does not match data written\n");
		TC_PRINT("Data read:\"%s\"\n\n", read_buff);
		return TC_FAIL;
	}

	TC_PRINT("Data read matches data written\n");

	return res;
}

int test_file_close(struct fs_file_t *filep)
{
	int res;

	TC_PRINT("\nClose tests:\n");

	res = fs_close(filep);
	if (res) {
		TC_PRINT("Error closing file [%d]\n", res);
		return res;
	}


	return res;
}

int test_file_delete(const char *file_path)
{
	int res;


	TC_PRINT("\nDelete tests:\n");

	/* Verify fs_unlink() */
	res = fs_unlink(file_path);
	if (res) {
		TC_PRINT("Error deleting file [%d]\n", res);
		return res;
	}

	/* Check if file was deleted */
	if (check_file_dir_exists(file_path)) {
		TC_PRINT("Failed deleting %s\n", file_path);
		return TC_FAIL;
	}

	TC_PRINT("File (%s) deleted successfully!\n", file_path);

	return res;
}
