
import {IColumn} from './index.d';

export type operation = "ADD" | "DROP" | "MODIFY";


export function createDatabaseOrExercise(categoryName: string) {
    return 'CREATE DATABASE ' + categoryName;
}

export function createSchema(schemaName: string) {
    return 'CREATE SCHEMA ' + schemaName;
}

export function drop(tableName: string) {
    return 'DROP TABLE ' + tableName;
}

export async function createTable(table: string, columns?: IColumn[]) {
    const operation = 'CREATE TABLE';
    let query = '';
    if (columns) {
        let tableColumns = '';
        for (const column of columns) {
            if (column.constraints.length) {
                for (const constraint of column.constraints) {
                    tableColumns += `\n${column.fieldName} ${column.datatype} ${constraint} ,`
                }
            } else {
                tableColumns += `\n${column.fieldName} ${column.datatype} ,`
            }
        }
        query = `${operation} ${table} (${tableColumns.substring(0, tableColumns.length - 2)})`;
        return query
    }
    query = `${operation} ${table}`;
    return query;
}


export function alter(tablename: string, fields: any, operation: operation, modifyTableConstraints: boolean) {
    if (operation === 'ADD') {

        if (modifyTableConstraints) {
            if (fields.constraint === "FOREIGN KEY" || fields.constraint === "UNIQUE FOREIGN KEY") {
                return `ALTER TABLE ${tablename} ${operation} CONSTRAINT ${fields.constraint} (${fields.target}) REFERENCES ${fields.sourceTable} (${fields.source})`
            } return `ALTER TABLE ${tablename} ${operation} CONSTRAINT ${fields.constraint} (${fields.column})`;
        } else return `ALTER TABLE ${tablename} ${operation} (${fields.columnname} ${fields.datatype})`;
    }
    else if (operation === 'DROP') {
        return modifyTableConstraints ? `ALTER TABLE ${tablename} ${operation} CONSTRAINT ${fields.constraint} (${fields.column})` :
            `ALTER TABLE ${tablename} ${operation} (${fields.columnname})`
    }
    else if (operation === 'MODIFY') {
        return modifyTableConstraints ? `ALTER TABLE ${tablename} ${operation} CONSTRAINT ${fields.constraint} (${fields.column})` :
            `ALTER TABLE ${tablename} ${operation} (${fields.columnname} ${fields.datatype})`
    }

}

export function truncate(tableName: string) {
    return `TRUNCATE TABLE ${tableName}`;
}

export function rename(Old_Table_Name: string, New_Table_Name: string) {
    return `RENAME TABLE ${Old_Table_Name} TO ${New_Table_Name}`;

}
