import { ViewColumn, ViewEntity } from "typeorm";

@ViewEntity({
  expression: `
    WITH resultData AS (
        SELECT
            commandDateAffect,
            positionName,
            positionCee,
            TIMESTAMPDIFF(
                DAY,
                LAG(MIN(commandDateAffect)) OVER (ORDER BY commandDateAffect), MIN(commandDateAffect)) AS days_diff,
            TIMESTAMPDIFF(
                DAY,
                LAG(MIN(commandDateAffect)) OVER (ORDER BY commandDateAffect), MIN(commandDateAffect)) / 365.2524 AS 'Years',
            TIMESTAMPDIFF(
                DAY,
                LAG(MIN(commandDateAffect)) OVER (ORDER BY commandDateAffect), MIN(commandDateAffect)) / 30.4375 % 12 AS 'Months',
            TIMESTAMPDIFF(
                DAY,
                LAG(MIN(commandDateAffect)) OVER (ORDER BY commandDateAffect), MIN(commandDateAffect)) % 30.4375  AS 'Days',
            posNo,
            positionExecutive,
            positionType,
            positionLevel,
            orgRoot,
            orgChild1,
            orgChild2,
            orgChild3,
            orgChild4,
            commandCode,
            commandName,
            commandNo,
            commandYear,
            remark,
            profileId,
            ROW_NUMBER() OVER (PARTITION BY profileId ORDER BY commandDateAffect ASC) AS orderNumber
        FROM (
            SELECT
                commandDateAffect,
                commandDateSign,
                positionName,
                positionCee,
                posNo,
                positionExecutive,
                positionType,
                positionLevel,
                orgRoot,
                orgChild1,
                orgChild2,
                orgChild3,
                orgChild4,
                commandCode,
                commandName,
                commandNo,
                commandYear,
                remark,
                profileId,
                LAG(commandDateSign) OVER (ORDER BY commandDateAffect ASC, commandDateSign ASC) AS prevCommandDateSign,
                ROW_NUMBER() OVER (ORDER BY commandDateAffect ASC, commandDateSign ASC) -
                ROW_NUMBER() OVER (PARTITION BY positionName ORDER BY commandDateAffect ASC, commandDateSign ASC) as groupedId
            FROM
                profileSalary
            WHERE
                commandCode IN (1, 2, 3, 4, 8, 10, 11, 12, 15, 16)
            ORDER BY
                commandDateAffect ASC, commandDateSign ASC
        ) AS groupedPosition
        WHERE
            prevCommandDateSign IS NULL OR commandDateSign >= prevCommandDateSign
        GROUP BY
            groupedId, positionName, positionCee, positionType, positionLevel
    )
    SELECT
        commandDateAffect,
        positionName,
        positionCee,
        days_diff, 
        Years,
        Months,
        Days,
        posNo,
        positionExecutive,
        positionType,
        positionLevel,
        orgRoot,
        orgChild1,
        orgChild2,
        orgChild3,
        orgChild4,
        commandCode,
        commandName,
        commandNo,
        commandYear,
        remark,
        profileId,
        orderNumber
    FROM resultData

    UNION ALL

    SELECT
        CURDATE() AS commandDateAffect,
        NULL AS positionName,
        NULL AS positionCee,
        TIMESTAMPDIFF(DAY, MAX(commandDateAffect), CURDATE()) AS days_diff,
        TIMESTAMPDIFF(DAY, MAX(commandDateAffect), CURDATE()) / 365.2524 AS 'Years',
        TIMESTAMPDIFF(DAY, MAX(commandDateAffect), CURDATE()) / 30.4375 % 12 AS 'Months',
        TIMESTAMPDIFF(DAY, MAX(commandDateAffect), CURDATE()) % 30.4375 AS 'Days',
        NULL AS posNo,
        NULL AS positionExecutive,
        NULL AS positionType,
        NULL AS positionLevel,
        NULL AS orgRoot,
        NULL AS orgChild1,
        NULL AS orgChild2,
        NULL AS orgChild3,
        NULL AS orgChild4,
        NULL AS commandCode,
        NULL AS commandName,
        NULL AS commandNo,
        NULL AS commandYear,
        NULL AS remark,
        profileId,
        NULL AS orderNumber
    FROM resultData
  `,
})
export class viewCurrentTenureLevelOfficer {
  @ViewColumn()
  commandDateAffect: Date;

  @ViewColumn()
  days_diff: number;

  @ViewColumn()
  Years: number;

  @ViewColumn()
  Months: number;

  @ViewColumn()
  Days: number;

  @ViewColumn()
  positionName: string;

  @ViewColumn()
  positionCee: string;

  @ViewColumn()
  posNo: string;

  @ViewColumn()
  positionExecutive: string;

  @ViewColumn()
  positionType: string;

  @ViewColumn()
  positionLevel: string;

  @ViewColumn()
  orgRoot: string;

  @ViewColumn()
  orgChild1: string;

  @ViewColumn()
  orgChild2: string;

  @ViewColumn()
  orgChild3: string;

  @ViewColumn()
  orgChild4: string;

  @ViewColumn()
  commandCode: number;

  @ViewColumn()
  commandName: string;

  @ViewColumn()
  commandNo: string;

  @ViewColumn()
  commandYear: number;

  @ViewColumn()
  remark: string;

  @ViewColumn()
  profileId: string;

  @ViewColumn()
  orderNumber: number;
}
