const { Model, DataTypes } = require('sequelize');

/**
 * User Model
 * Repräsentiert die user-Tabelle
 */
class User extends Model {
  static initialize(sequelize) {
    User.init(
      {
        id: {
          type: DataTypes.BIGINT,
          primaryKey: true,
          autoIncrement: true,
          allowNull: false
        },
        version: {
          type: DataTypes.INTEGER,
          allowNull: false,
          defaultValue: 0
        },
        last_change: {
          type: DataTypes.DATE,
          allowNull: true
        },
        role: {
          type: DataTypes.INTEGER,
          allowNull: false,
          defaultValue: 0
        },
        daily_hours: {
          type: DataTypes.INTEGER,
          allowNull: false,
          defaultValue: 8
        },
        state_id: {
          type: DataTypes.BIGINT,
          allowNull: true
        },
        full_name: {
          type: DataTypes.TEXT,
          allowNull: false
        },
        week_hours: {
          type: DataTypes.INTEGER,
          allowNull: false,
          defaultValue: 40
        },
        week_workdays: {
          type: DataTypes.INTEGER,
          allowNull: false,
          defaultValue: 5
        },
        preferred_title_type: {
          type: DataTypes.INTEGER,
          allowNull: false,
          defaultValue: 0
        },
        overtime_offset_minutes: {
          type: DataTypes.INTEGER,
          allowNull: true,
          defaultValue: 0,
          comment: 'Überstunden-Startwert in Minuten (z.B. Übertrag aus altem System)'
        }
      },
      {
        sequelize,
        tableName: 'user',
        timestamps: false,
        indexes: [
          {
            name: 'fk_user_state',
            fields: ['state_id']
          }
        ]
      }
    );

    return User;
  }

  /**
   * Vollständigen Namen zurückgeben
   */
  getFullName() {
    return this.full_name;
  }

  /**
   * Tägliche Arbeitsstunden zurückgeben
   */
  getDailyHours() {
    return this.daily_hours;
  }

  /**
   * Wöchentliche Arbeitsstunden zurückgeben
   */
  getWeeklyHours() {
    return this.week_hours;
  }

  /**
   * Rolle als String zurückgeben
   * 0 = 'user', 1 = 'admin'
   */
  getRoleString() {
    return this.role === 1 ? 'admin' : 'user';
  }

  /**
   * JSON-Serialisierung überschreiben
   */
  toJSON() {
    const values = { ...this.get() };
    // Füge role_string hinzu für Frontend
    values.role_string = this.getRoleString();
    return values;
  }
}

module.exports = User;

