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/user/user";
import { refresh } from "./entity/refresh";
import { invite } from "./entity/user/invite";
import { userPermission } from "./entity/user/user_permission";
import { role } from "./entity/user/role";
import { rolePermission } from "./entity/user/role_permission";
import { award } from "./entity/settings/award";
import { communication } from "./entity/club/member/communication";
import { communicationType } from "./entity/settings/communicationType";
import { executivePosition } from "./entity/settings/executivePosition";
import { membershipStatus } from "./entity/settings/membershipStatus";
import { qualification } from "./entity/settings/qualification";

import { Initial1724317398939 } from "./migrations/1724317398939-initial";
import { RefreshPrimaryChange1724573307851 } from "./migrations/1724573307851-refreshPrimaryChange";
import { Invite1724579024939 } from "./migrations/1724579024939-invite";
import { Permissions1724661484664 } from "./migrations/1724661484664-permissions";
import { RolePermission1724771491085 } from "./migrations/1724771491085-role_permission";
import { MemberBaseData1725435669492 } from "./migrations/1725435669492-member_base_data";
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 { Memberdata1726301836849 } from "./migrations/1726301836849-memberdata";
import { CommunicationFields1727439800630 } from "./migrations/1727439800630-communicationFields";
import { Ownership1728313041449 } from "./migrations/1728313041449-ownership";
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 { Protocol1729347911107 } from "./migrations/1729347911107-protocol";
import { calendar } from "./entity/club/calendar";
import { calendarType } from "./entity/settings/calendarType";
import { Calendar1729947763295 } from "./migrations/1729947763295-calendar";
import { reset } from "./entity/reset";
import { ResetToken1732358596823 } from "./migrations/1732358596823-resetToken";
import { SMSAlarming1732696919191 } from "./migrations/1732696919191-SMSAlarming";
import { SecuringCalendarType1733249553766 } from "./migrations/1733249553766-securingCalendarType";
import { query } from "./entity/settings/query";
import { QueryStore1734187754677 } from "./migrations/1734187754677-queryStore";
import { memberView } from "./views/memberView";
import { memberExecutivePositionsView } from "./views/memberExecutivePositionView";
import { memberQualificationsView } from "./views/memberQualificationsView";
import { membershipView } from "./views/membershipsView";
import { MemberDataViews1734520998539 } from "./migrations/1734520998539-memberDataViews";
import { template } from "./entity/settings/template";
import { Template1734854680201 } from "./migrations/1734854680201-template";
import { templateUsage } from "./entity/settings/templateUsage";
import { TemplateUsage1734949173739 } from "./migrations/1734949173739-templateUsage";
import { newsletter } from "./entity/club/newsletter/newsletter";
import { newsletterDates } from "./entity/club/newsletter/newsletterDates";
import { newsletterRecipients } from "./entity/club/newsletter/newsletterRecipients";
import { Newsletter1735118780511 } from "./migrations/1735118780511-newsletter";
import { newsletterConfig } from "./entity/settings/newsletterConfig";
import { NewsletterConfig1735207446910 } from "./migrations/1735207446910-newsletterConfig";
import { InternalId1735822722235 } from "./migrations/1735822722235-internalId";
import { PostalCode1735927918979 } from "./migrations/1735927918979-postalCode";
import { ProtocolAbsent1736072179716 } from "./migrations/1736072179716-protocolAbsent";
import { Memberlist1736079005086 } from "./migrations/1736079005086-memberlist";
import { ExtendViewValues1736084198860 } from "./migrations/1736084198860-extendViewValues";
import { FinishInternalIdTransfer1736505324488 } from "./migrations/1736505324488-finishInternalIdTransfer";
import { ProtocolPresenceExcuse1737287798828 } from "./migrations/1737287798828-protocolPresenceExcuse";
import { webapi } from "./entity/user/webapi";
import { webapiPermission } from "./entity/user/webapi_permission";
import { AddWebapiTokens1737453096674 } from "./migrations/1737453096674-addwebapiTokens";
import { salutation } from "./entity/settings/salutation";
import { SalutationAsTable1737796878058 } from "./migrations/1737796878058-salutationAsTable";
import { UpdateViews1737800468938 } from "./migrations/1737800468938-updateViews";
import { MoveSendNewsletterFlag1737816852011 } from "./migrations/1737816852011-moveSendNewsletterFlag";
import { UniqueFields1738057119384 } from "./migrations/1738057119384-UniqueFields";

const dataSource = new DataSource({
  type: DB_TYPE as any,
  host: process.env.NODE_ENV || process.env.DBMODE ? "localhost" : 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: [
    Initial1724317398939,
    RefreshPrimaryChange1724573307851,
    Invite1724579024939,
    Permissions1724661484664,
    RolePermission1724771491085,
    MemberBaseData1725435669492,
    Memberdata1726301836849,
    CommunicationFields1727439800630,
    Ownership1728313041449,
    Protocol1729347911107,
    Calendar1729947763295,
    ResetToken1732358596823,
    SMSAlarming1732696919191,
    SecuringCalendarType1733249553766,
    QueryStore1734187754677,
    MemberDataViews1734520998539,
    Template1734854680201,
    TemplateUsage1734949173739,
    Newsletter1735118780511,
    NewsletterConfig1735207446910,
    InternalId1735822722235,
    PostalCode1735927918979,
    ProtocolAbsent1736072179716,
    Memberlist1736079005086,
    ExtendViewValues1736084198860,
    FinishInternalIdTransfer1736505324488,
    ProtocolPresenceExcuse1737287798828,
    AddWebapiTokens1737453096674,
    SalutationAsTable1737796878058,
    UpdateViews1737800468938,
    MoveSendNewsletterFlag1737816852011,
    UniqueFields1738057119384,
  ],
  migrationsRun: true,
  migrationsTransactionMode: "each",
  subscribers: [],
});

export { dataSource };