import { clamp } from '../utils/helpers.js';
export class ConfigurationManager {
constructor() {
this.scoreThreshold = 80;
this.resultLimit = 10;
this.scoringWeights = {
md5Jaccard: 40,
nameLength: 30,
md5Coverage: 20,
orderScore: 10
};
this.loadConfig();
}
loadConfig() {
const storedThreshold = localStorage.getItem('scoreThreshold');
if (storedThreshold !== null) {
const parsed = parseInt(storedThreshold, 10);
this.scoreThreshold = isNaN(parsed) ? 80 : clamp(parsed, 0, 100);
}
const storedLimit = localStorage.getItem('resultLimit');
if (storedLimit !== null) {
const parsed = parseInt(storedLimit, 10);
this.resultLimit = isNaN(parsed) ? 10 : clamp(parsed, 1, 50);
}
this.scoringWeights = {
md5Jaccard: this._loadWeight('md5JaccardWeight', 40),
nameLength: this._loadWeight('nameLengthWeight', 30),
md5Coverage: this._loadWeight('md5CoverageWeight', 20),
orderScore: this._loadWeight('orderScoreWeight', 10)
};
this.updateUI();
}
_loadWeight(key, defaultValue) {
const stored = localStorage.getItem(key);
if (stored === null) return defaultValue;
const parsed = parseInt(stored, 10);
return isNaN(parsed) ? defaultValue : clamp(parsed, 0, 100);
}
saveConfig() {
localStorage.setItem('scoreThreshold', String(this.scoreThreshold));
localStorage.setItem('resultLimit', String(this.resultLimit));
localStorage.setItem('md5JaccardWeight', String(this.scoringWeights.md5Jaccard));
localStorage.setItem('nameLengthWeight', String(this.scoringWeights.nameLength));
localStorage.setItem('md5CoverageWeight', String(this.scoringWeights.md5Coverage));
localStorage.setItem('orderScoreWeight', String(this.scoringWeights.orderScore));
}
setScoreThreshold(value) {
const parsed = typeof value === 'string' ? parseInt(value, 10) : value;
this.scoreThreshold = isNaN(parsed) ? this.scoreThreshold : clamp(parsed, 0, 100);
this.saveConfig();
}
setWeight(key, value) {
const parsed = typeof value === 'string' ? parseInt(value, 10) : value;
if (!isNaN(parsed) && key in this.scoringWeights) {
this.scoringWeights[key] = clamp(parsed, 0, 100);
this.saveConfig();
}
}
updateUI() {
const elements = {
'score-threshold': this.scoreThreshold,
'threshold-value': this.scoreThreshold + '%',
'result-limit': this.resultLimit,
'md5-jaccard-weight': this.scoringWeights.md5Jaccard,
'md5-jaccard-value': this.scoringWeights.md5Jaccard + '%',
'name-length-weight': this.scoringWeights.nameLength,
'name-length-value': this.scoringWeights.nameLength + '%',
'md5-coverage-weight': this.scoringWeights.md5Coverage,
'md5-coverage-value': this.scoringWeights.md5Coverage + '%',
'order-score-weight': this.scoringWeights.orderScore,
'order-score-value': this.scoringWeights.orderScore + '%'
};
for (const [id, value] of Object.entries(elements)) {
const el = document.getElementById(id);
if (el) {
if (el.tagName === 'INPUT' || el.tagName === 'SELECT') {
el.value = value;
} else {
el.textContent = value;
}
}
}
}
getConfig() {
return {
scoreThreshold: this.scoreThreshold / 100,
resultLimit: this.resultLimit,
scoringWeights: { ...this.scoringWeights }
};
}
resetToDefaults() {
this.scoreThreshold = 80;
this.resultLimit = 10;
this.scoringWeights = {
md5Jaccard: 40,
nameLength: 30,
md5Coverage: 20,
orderScore: 10
};
this.saveConfig();
this.updateUI();
}
}