import { MigrationInterface, QueryRunner } from "typeorm"

export class AddFieldToLeaveRequests1769767465207 implements MigrationInterface {
  name = "AddFieldToLeaveRequests1769767465207"

  public async up(queryRunner: QueryRunner): Promise<void> {
    // Add leave_day_type to leave_requests
    await queryRunner.query(
      `ALTER TABLE "leave_requests" ADD "leave_day_type" character varying(20) NOT NULL DEFAULT 'FULL'`,
    )

    // Update payroll_entries columns
    await queryRunner.query(
      `ALTER TABLE "payroll_entries" DROP COLUMN "paid_leaves"`,
    )
    await queryRunner.query(
      `ALTER TABLE "payroll_entries" ADD "paid_leaves" numeric(5,2) NOT NULL DEFAULT '0'`,
    )
    await queryRunner.query(
      `ALTER TABLE "payroll_entries" DROP COLUMN "unpaid_leaves"`,
    )
    await queryRunner.query(
      `ALTER TABLE "payroll_entries" ADD "unpaid_leaves" numeric(5,2) NOT NULL DEFAULT '0'`,
    )

    // Create temporary column to store current available_days values
    await queryRunner.query(
      `ALTER TABLE "employee_leave_balances" ADD "temp_available_days" integer`,
    )
    await queryRunner.query(
      `UPDATE "employee_leave_balances" SET "temp_available_days" = "available_days"`,
    )

    // Update employee_leave_balances columns
    await queryRunner.query(
      `ALTER TABLE "employee_leave_balances" DROP COLUMN "used_days"`,
    )
    await queryRunner.query(
      `ALTER TABLE "employee_leave_balances" ADD "used_days" numeric(5,2) NOT NULL DEFAULT '0'`,
    )
    await queryRunner.query(
      `ALTER TABLE "employee_leave_balances" DROP COLUMN "carried_forward_days"`,
    )
    await queryRunner.query(
      `ALTER TABLE "employee_leave_balances" ADD "carried_forward_days" numeric(5,2) NOT NULL DEFAULT '0'`,
    )
    await queryRunner.query(
      `ALTER TABLE "employee_leave_balances" DROP COLUMN "available_days"`,
    )
    await queryRunner.query(
      `ALTER TABLE "employee_leave_balances" ADD "available_days" numeric(5,2) NOT NULL DEFAULT '0'`,
    )

    // Restore available_days values from temporary column
    await queryRunner.query(
      `UPDATE "employee_leave_balances" SET "available_days" = "temp_available_days"`,
    )
    await queryRunner.query(
      `ALTER TABLE "employee_leave_balances" DROP COLUMN "temp_available_days"`,
    )
  }

  public async down(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.query(
      `ALTER TABLE "employee_leave_balances" DROP COLUMN "available_days"`,
    )
    await queryRunner.query(
      `ALTER TABLE "employee_leave_balances" ADD "available_days" integer NOT NULL`,
    )
    await queryRunner.query(
      `ALTER TABLE "employee_leave_balances" DROP COLUMN "carried_forward_days"`,
    )
    await queryRunner.query(
      `ALTER TABLE "employee_leave_balances" ADD "carried_forward_days" integer NOT NULL DEFAULT '0'`,
    )
    await queryRunner.query(
      `ALTER TABLE "employee_leave_balances" DROP COLUMN "used_days"`,
    )
    await queryRunner.query(
      `ALTER TABLE "employee_leave_balances" ADD "used_days" integer NOT NULL DEFAULT '0'`,
    )
    await queryRunner.query(
      `ALTER TABLE "payroll_entries" DROP COLUMN "unpaid_leaves"`,
    )
    await queryRunner.query(
      `ALTER TABLE "payroll_entries" ADD "unpaid_leaves" integer NOT NULL DEFAULT '0'`,
    )
    await queryRunner.query(
      `ALTER TABLE "payroll_entries" DROP COLUMN "paid_leaves"`,
    )
    await queryRunner.query(
      `ALTER TABLE "payroll_entries" ADD "paid_leaves" integer NOT NULL DEFAULT '0'`,
    )
    await queryRunner.query(
      `ALTER TABLE "leave_requests" DROP COLUMN "leave_day_type"`,
    )
  }
}
