import "dotenv/config";
import "reflect-metadata";
import { DataSource } from "typeorm";
import { DB_HOST, DB_USERNAME, DB_PASSWORD, DB_NAME, DB_TYPE, DB_PORT } from "./env.defaults";

import { user } from "./entity/management/user";
import { refresh } from "./entity/refresh";
import { invite } from "./entity/management/invite";
import { userPermission } from "./entity/management/user_permission";
import { role } from "./entity/management/role";
import { rolePermission } from "./entity/management/role_permission";
import { award } from "./entity/configuration/award";
import { communication } from "./entity/club/member/communication";
import { communicationType } from "./entity/configuration/communicationType";
import { executivePosition } from "./entity/configuration/executivePosition";
import { membershipStatus } from "./entity/configuration/membershipStatus";
import { qualification } from "./entity/configuration/qualification";

import { member } from "./entity/club/member/member";
import { memberAwards } from "./entity/club/member/memberAwards";
import { memberExecutivePositions } from "./entity/club/member/memberExecutivePositions";
import { memberQualifications } from "./entity/club/member/memberQualifications";
import { membership } from "./entity/club/member/membership";
import { protocol } from "./entity/club/protocol/protocol";
import { protocolAgenda } from "./entity/club/protocol/protocolAgenda";
import { protocolDecision } from "./entity/club/protocol/protocolDecision";
import { protocolPresence } from "./entity/club/protocol/protocolPresence";
import { protocolVoting } from "./entity/club/protocol/protocolVoting";
import { protocolPrintout } from "./entity/club/protocol/protocolPrintout";
import { calendar } from "./entity/club/calendar";
import { calendarType } from "./entity/configuration/calendarType";
import { reset } from "./entity/reset";
import { query } from "./entity/configuration/query";
import { memberView } from "./views/memberView";
import { memberExecutivePositionsView } from "./views/memberExecutivePositionView";
import { memberQualificationsView } from "./views/memberQualificationsView";
import { membershipView } from "./views/membershipsView";
import { template } from "./entity/configuration/template";
import { templateUsage } from "./entity/configuration/templateUsage";
import { newsletter } from "./entity/club/newsletter/newsletter";
import { newsletterDates } from "./entity/club/newsletter/newsletterDates";
import { newsletterRecipients } from "./entity/club/newsletter/newsletterRecipients";
import { newsletterConfig } from "./entity/configuration/newsletterConfig";
import { webapi } from "./entity/management/webapi";
import { webapiPermission } from "./entity/management/webapi_permission";
import { salutation } from "./entity/configuration/salutation";

import { BackupAndResetDatabase1738166124200 } from "./migrations/1738166124200-BackupAndResetDatabase";
import { CreateSchema1738166167472 } from "./migrations/1738166167472-CreateSchema";
import { TemplatesAndProtocolSort1742549956787 } from "./migrations/1742549956787-templatesAndProtocolSort";
import { QueryToUUID1742922178643 } from "./migrations/1742922178643-queryToUUID";
import { NewsletterColumnType1744351418751 } from "./migrations/1744351418751-newsletterColumnType";

const dataSource = new DataSource({
  type: DB_TYPE as any,
  host: DB_HOST,
  port: DB_PORT,
  username: DB_USERNAME,
  password: DB_PASSWORD,
  database: DB_NAME,
  synchronize: false,
  logging: process.env.NODE_ENV ? true : ["schema", "error", "warn", "log", "migration"],
  bigNumberStrings: false,
  entities: [
    user,
    refresh,
    invite,
    reset,
    userPermission,
    role,
    rolePermission,
    award,
    communication,
    communicationType,
    executivePosition,
    membershipStatus,
    qualification,
    salutation,
    member,
    memberAwards,
    memberExecutivePositions,
    memberQualifications,
    membership,
    protocol,
    protocolAgenda,
    protocolDecision,
    protocolPresence,
    protocolVoting,
    protocolPrintout,
    calendar,
    calendarType,
    query,
    template,
    templateUsage,
    newsletter,
    newsletterDates,
    newsletterRecipients,
    newsletterConfig,
    memberView,
    memberExecutivePositionsView,
    memberQualificationsView,
    membershipView,
    webapi,
    webapiPermission,
  ],
  migrations: [
    BackupAndResetDatabase1738166124200,
    CreateSchema1738166167472,
    TemplatesAndProtocolSort1742549956787,
    QueryToUUID1742922178643,
    NewsletterColumnType1744351418751,
  ],
  migrationsRun: true,
  migrationsTransactionMode: "each",
  subscribers: [],
});

export { dataSource };