import type { FeatureDependencies } from "../../baseDeviceFeatures";
import { DeviceStateWriter } from "../../deviceStateWriter";
import { VACUUM_CONSTANTS } from "../vacuumConstants";

export class StationService {
	private readonly stateWriter: DeviceStateWriter;

	constructor(
		private deps: FeatureDependencies,
		duid: string
	) {
		this.stateWriter = new DeviceStateWriter(deps, duid);
	}

	public async initDockingStationStatus(): Promise<void> {
		await this.stateWriter.ensureFolder("dockingStationStatus");

		// Define status definitions with their respective translation keys for "Error/Maintenance" state (value 1)
		const statusDefinitions: Record<string, string> = {
			"cleanFluidStatus": "dock_info_clean_fluid_exception",
			"waterBoxFilterStatus": "dock_info_item_gone_exception",
			"dustBagStatus": "dock_info_dust_bag_exception",
			"dirtyWaterBoxStatus": "dock_info_dirty_water_box_exception1",
			"clearWaterBoxStatus": "dock_info_clear_water_box_exception1",
			"isUpdownWaterReady": "inner_error_name_152"
		};

		// Common states for 0 (Not Supported), 2 (OK), 3 (Unknown)
		const txtNotSupported = this.deps.adapter.translationManager.get("localization_strings_Setting_General_index_0", "Not supported");
		const txtOK = this.deps.adapter.translationManager.get("localization_strings_Main_Error_ErrorDetailPage_3", "OK");
		const txtUnknown = this.deps.adapter.translationManager.get("localization_strings_Setting_General_index_0", "Unknown");

		for (const [name, errorKey] of Object.entries(statusDefinitions)) {
			// If errorKey itself is not in translation, we use a generic native Roborock key as fallback.
			const commonFallbackKey = errorKey.includes("error_") ? "localization_strings_Main_Error_ErrorDetailPage_3" : "dust_collection_life12";
			const txtMaintenance = this.deps.adapter.translationManager.get(errorKey, this.deps.adapter.translationManager.get(commonFallbackKey));

			const states = {
				"0": txtNotSupported,
				"1": txtMaintenance,
				"2": txtOK,
				"3": txtUnknown
			};

			// Fetch localized name for the state itself
			const nameKey = VACUUM_CONSTANTS.dockingStationTranslationKeys[name as keyof typeof VACUUM_CONSTANTS.dockingStationTranslationKeys];
			const localizedName = nameKey ? this.deps.adapter.translationManager.get(nameKey, name) : name;

			await this.stateWriter.ensureState(`dockingStationStatus.${name}`, {
				name: localizedName,
				type: "number",
				role: "value",
				read: true,
				write: false,
				states: states
			});
		}
	}

	public async updateDockingStationStatus(dss: number): Promise<void> {
		const status = {
			cleanFluidStatus: ((dss >> 10) & 0b11),
			waterBoxFilterStatus: ((dss >> 8) & 0b11),
			dustBagStatus: ((dss >> 6) & 0b11),
			dirtyWaterBoxStatus: ((dss >> 4) & 0b11),
			clearWaterBoxStatus: ((dss >> 2) & 0b11),
			isUpdownWaterReady: (dss & 0b11),
		};

		for (const [name, val] of Object.entries(status)) {
			await this.stateWriter.setState(`dockingStationStatus.${name}`, val);
		}
	}
}
