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

/**
 * Worklog Model
 * Repräsentiert die worklog-Tabelle für Zeiteinträge
 */
class Worklog extends Model {
  static initialize(sequelize) {
    Worklog.init(
      {
        id: {
          type: DataTypes.BIGINT,
          primaryKey: true,
          autoIncrement: true,
          allowNull: false
        },
        version: {
          type: DataTypes.INTEGER,
          allowNull: false,
          defaultValue: 0
        },
        user_id: {
          type: DataTypes.BIGINT,
          allowNull: false,
          references: {
            model: 'user',
            key: 'id'
          }
        },
        state: {
          type: DataTypes.TEXT,
          allowNull: false,
          get() {
            const rawValue = this.getDataValue('state');
            try {
              return JSON.parse(rawValue);
            } catch {
              return { action: rawValue, project: 'Allgemein', description: '' };
            }
          },
          set(value) {
            if (typeof value === 'object') {
              this.setDataValue('state', JSON.stringify(value));
            } else {
              this.setDataValue('state', value);
            }
          }
        },
        tstamp: {
          type: DataTypes.STRING(19), // 'YYYY-MM-DD HH:MM:SS' = 19 Zeichen
          allowNull: true,
          comment: 'Lokale Zeit ohne TZ-Info, Format: YYYY-MM-DD HH:MM:SS'
        },
        relatedTo_id: {
          type: DataTypes.BIGINT,
          allowNull: true,
          field: 'relatedTo_id', // Explizit den Spaltennamen in der DB angeben
          references: {
            model: 'worklog',
            key: 'id'
          }
        }
      },
      {
        sequelize,
        tableName: 'worklog',
        timestamps: false,
        indexes: [
          {
            name: 'fk_worklog_relatedTo',
            fields: ['relatedTo_id']
          },
          {
            name: 'worklog_tstamp_IDX',
            fields: ['tstamp']
          },
          {
            name: 'worklog_user_id_IDX',
            fields: ['user_id', 'tstamp']
          }
        ]
      }
    );

    return Worklog;
  }

  /**
   * Prüft, ob dies ein Clock-In Eintrag ist
   */
  isClockIn() {
    return this.relatedTo_id === null;
  }

  /**
   * Prüft, ob dies ein Clock-Out Eintrag ist
   */
  isClockOut() {
    return this.relatedTo_id !== null;
  }

  /**
   * Gibt den State-Action zurück
   */
  getAction() {
    const state = this.state;
    return state.action || state;
  }

  /**
   * Gibt das Projekt zurück
   */
  getProject() {
    const state = this.state;
    return state.project || 'Allgemein';
  }

  /**
   * Gibt die Beschreibung zurück
   */
  getDescription() {
    const state = this.state;
    return state.description || '';
  }
}

module.exports = Worklog;

