import express from "express";
import knex from 'knex';
import AwardService from "../service/awardService";
import { CreateAwardCommand, DeleteAwardCommand } from "../command/awardCommand";
import AwardCommandHandler from "../command/awardCommandHandler";
import { award } from "../entity/award";
import MemberService from "../service/memberService";
import { CreateMemberCommand, DeleteMemberCommand } from "../command/memberCommand";
import { member } from "../entity/member";
import MemberCommandHandler from "../command/memberCommandHandler";
import { Salutation } from "../enums/salutation";
import MemberAwardCommandHandler from "../command/memberAwardCommandHandler";
import { CreateMemberAwardCommand, DeleteMemberAwardCommand } from "../command/memberAwardCommand";
import MemberAwardService from "../service/memberAwardService";

var router = express.Router({ mergeParams: true });

router.get("/", async (req, res) => {

  const dbhost = process.env.OLD_DB_HOST;
  const dbport = Number(process.env.OLD_DB_PORT);
  const dbuser = process.env.OLD_DB_USER;
  const dbuserpass = process.env.OLD_DB_USERPASS;
  const dbname = process.env.OLD_DB_NAME;

  const db = knex({
    client: 'mssql',
    connection: {
      host: dbhost,
      port: dbport,
      user: dbuser,
      password: dbuserpass,
      database: dbname,
      options: {
        trustServerCertificate: true,
        enableArithAbort: true,
        encrypt: true
      }
    },
    debug: false,
    pool: {
      min: 0, max: 30
    }
  });

  let queryResult = await db('Mitglieder');
  console.log(`Read ${queryResult.length} Mitglieder`);

  // Delete members
  let [members, total] = await MemberService.getAll(0, 9999);
  for (const m of members) {

    // delete all member awards of this member
    let memberAwards = await MemberAwardService.getAll(m.id);
    for (const award of memberAwards) {
      let deleteMemberAward: DeleteMemberAwardCommand = {
        id: award.id, memberId: m.id
      };
      console.log(`Deleting award ${award.id} from member ${m.id}`);
      await MemberAwardCommandHandler.delete(deleteMemberAward)
    }

    let deleteMember: DeleteMemberCommand = {
      id: m.id,
    };
    console.log(`Delete member ${m.id}`);
    await MemberCommandHandler.delete(deleteMember);
  }

  // Delete awards
  let awards = await AwardService.getAll();
  for (const award of awards) {
    let deleteAward: DeleteAwardCommand = {
      id: award.id,
    };
    console.log(`Delete award ${award.id}`);
    await AwardCommandHandler.delete(deleteAward);
  }

  const sAwardsById :any = {};
  const sAwardsByName :any = {};

  // Create Awards
  const awardNames = ['Ehrennadel Silber', 'Ehrennadel Gold', 'Ehrenkreuz Silber', 'Ehrenkreuz Gold', 'Ehrenmitgliedschaft', 'Ehrung 25 Jahre aktiv', 'Ehrung 40 Jahre aktiv'];
  for (const awardName of awardNames) {
    let createAward: CreateAwardCommand = {
      award: awardName,
    };
    const awardId = await AwardCommandHandler.create(createAward);
    console.log(`Created award ${awardName} with id ${awardId}`);
    sAwardsById[awardId] = awardName;
    sAwardsByName[awardName] = awardId;
  }

  for (const queryResultElement of queryResult) {
    let nameAffix :string = '';
    let nn = queryResultElement.Nachname.trim();
    if (nn.endsWith(', jun.')) {
      nameAffix = 'jun.';
      nn = nn.substring(0, nn.length - 6);
    }
    if (nn.endsWith(', sen.')) {
      nameAffix = 'sen.';
      nn = nn.substring(0, nn.length - 6);
    }
    let newMember: CreateMemberCommand = {
      salutation: queryResultElement.Anrede.trim(),
      firstname: queryResultElement.Vorname.trim(),
      lastname: nn,
      nameaffix: nameAffix,
      birthdate: queryResultElement.Geboren ? queryResultElement.Geboren : '1900-01-01',
    }
    const memberId = await MemberCommandHandler.create(newMember);
    console.log(`Created member ${newMember.firstname} ${newMember.lastname} with id ${memberId}`);

    for (const awardId in sAwardsById) {
      const awardName = sAwardsById[awardId];

      if (queryResultElement[awardName]) {
        const awardDate = queryResultElement[awardName];
        console.log(`Member ${newMember.firstname} ${newMember.lastname} got award ${awardName} at ${awardDate}`);

        let given = true;
        let note = '';
        if (awardName === 'Ehrung 25 Jahre aktiv' && queryResultElement['keineEhrung25JahreAktivGrund'] !== null) {
          given = false;
          note = queryResultElement['keineEhrung25JahreAktivGrund'].trim();
        }
        if (awardName === 'Ehrennadel Silber' && queryResultElement['keineEhrennadelSilberGrund'] !== null) {
          given = false;
          note = queryResultElement['keineEhrennadelSilberGrund'].trim();
        }
        if (awardName === 'Ehrennadel Gold' && queryResultElement['keineEhrennadelGoldGrund'] !== null) {
          given = false;
          note = queryResultElement['keineEhrennadelGoldGrund'].trim();
        }

        let newMemberAward: CreateMemberAwardCommand = {
          awardId: parseInt(awardId), date: awardDate, given: given, memberId: memberId, note: note
        }
        await MemberAwardCommandHandler.create(newMemberAward);
      }

    }


  }

  res.sendStatus(200);
});

export default router;