import { MigrationInterface, QueryRunner, Table } from "typeorm"

export class CreateMenuTables1695000000000 implements MigrationInterface {

    private getIdColumn() {
        return {
            name: "id",
            type: "varchar",
            length: "36",
            isPrimary: true,
            generationStrategy: "uuid",
            default: "(UUID())"
        };
    }

    private getTimestampColumns() {
        return [
            {
                name: "created_at",
                type: "timestamp",
                default: "CURRENT_TIMESTAMP"
            },
            {
                name: "updated_at",
                type: "timestamp",
                default: "CURRENT_TIMESTAMP"
            }
        ];
    }

    private getIsActiveColumn() {
        return {
            name: "isActive",
            type: "boolean",
            default: true
        };
    }

    private getOrderColumn(defaultValue?: number) {
        const column: any = {
            name: "order",
            type: "int"
        };
        if (defaultValue !== undefined) {
            column.default = defaultValue;
        }
        return column;
    }

    private getTitleColumn() {
        return {
            name: "title",
            type: "varchar",
            length: "255"
        };
    }

    public async up(queryRunner: QueryRunner): Promise<void> {
        // Create Disclaimer table
        await queryRunner.createTable(new Table({
            name: "Disclaimer",
            columns: [
                this.getIdColumn(),
                this.getTitleColumn(),
                {
                    name: "content",
                    type: "text"
                },
                this.getIsActiveColumn(),
                ...this.getTimestampColumns()
            ]
        }), true)

        // Create HowItWorksSteps table
        await queryRunner.createTable(new Table({
            name: "HowItWorksSteps",
            columns: [
                this.getIdColumn(),
                {
                    name: "stepNumber",
                    type: "varchar",
                    length: "10"
                },
                this.getTitleColumn(),
                {
                    name: "description",
                    type: "text"
                },
                {
                    name: "icon",
                    type: "varchar",
                    length: "255",
                    isNullable: true
                },
                this.getOrderColumn(),
                this.getIsActiveColumn(),
                ...this.getTimestampColumns()
            ]
        }), true)

        // Create Testimonials table
        await queryRunner.createTable(new Table({
            name: "Testimonials",
            columns: [
                this.getIdColumn(),
                {
                    name: "name",
                    type: "varchar",
                    length: "255"
                },
                {
                    name: "designation",
                    type: "varchar",
                    length: "255"
                },
                {
                    name: "testimonial",
                    type: "text"
                },
                {
                    name: "userImage",
                    type: "varchar",
                    length: "500",
                    isNullable: true
                },
                {
                    name: "backgroundImage",
                    type: "varchar",
                    length: "500",
                    isNullable: true
                },
                this.getOrderColumn(0),
                this.getIsActiveColumn(),
                ...this.getTimestampColumns()
            ]
        }), true)

        // Create EducationCourses table
        await queryRunner.createTable(new Table({
            name: "EducationCourses",
            columns: [
                this.getIdColumn(),
                this.getTitleColumn(),
                {
                    name: "subtitle",
                    type: "text"
                },
                {
                    name: "type",
                    type: "varchar",
                    length: "100"
                },
                {
                    name: "duration",
                    type: "varchar",
                    length: "50"
                },
                {
                    name: "color",
                    type: "varchar",
                    length: "20"
                },
                {
                    name: "icon",
                    type: "varchar",
                    length: "255",
                    isNullable: true
                },
                this.getOrderColumn(0),
                this.getIsActiveColumn(),
                ...this.getTimestampColumns()
            ]
        }), true)
    }

    public async down(queryRunner: QueryRunner): Promise<void> {
        await queryRunner.dropTable("EducationCourses")
        await queryRunner.dropTable("Testimonials")
        await queryRunner.dropTable("HowItWorksSteps")
        await queryRunner.dropTable("Disclaimer")
    }
}