import {
	VerbrauchsausweisWohnenSchema,
	AufnahmeSchema,
	ObjektSchema,
	BildSchema,
	RechnungSchema,
	EventSchema,
	BenutzerSchema,
	GebaeudePlaeneSchema,
	AnteilshaberSchema,
	BedarfsausweisWohnenSchema,
	VerbrauchsausweisGewerbeSchema
} from "#lib/client/prisma";
import { z } from "zod";

export const RechnungValidator = RechnungSchema.omit({
	aufnahme_id: true,
	id: true,
	benutzer_id: true
})

export const GebaeudePlaeneValidator = GebaeudePlaeneSchema.omit({
	id: true,
	objekt_id: true
})

export const AnteilshaberValidator = AnteilshaberSchema.omit({
	benutzer_id: true,
	id: true,
	objekt_id: true
})

export const BildValidator = BildSchema.omit({
	id: true,
	objekt_id: true
})

export const AufnahmeValidator = AufnahmeSchema.omit({
	id: true,
	benutzer_id: true,
	objekt_id: true,
}).merge(
	z.object({
		verbrauchsausweis_wohnen: VerbrauchsausweisWohnenSchema.omit({
			id: true,
			benutzer_id: true,
			aufnahme_id: true,
		}).nullable(),
		bedarfsausweis_wohnen: VerbrauchsausweisWohnenSchema.omit({
			id: true,
			benutzer_id: true,
			aufnahme_id: true,
		}).nullable(),
		verbrauchsausweis_gewerbe: VerbrauchsausweisWohnenSchema.omit({
			id: true,
			benutzer_id: true,
			aufnahme_id: true,
		}).nullable(),
		rechnungen: z.array(
			RechnungValidator
		),
		events: z.array(
			EventSchema.omit({
				benutzer_id: true,
				id: true,
			}).merge(
				z.object({
					benutzer: BenutzerSchema.pick({ uid: true }),
				})
			)
		),
	})
); 

export const ObjektValidator = ObjektSchema.omit({
	benutzer_id: true,
	id: true
}).merge(z.object({
	aufnahme: z.array(
		AufnahmeValidator
	).nullable().optional(),
	bilder: z.array(
		BildValidator
	).nullable().optional(),
	gebaeude_plaene: z.array(
		GebaeudePlaeneValidator
	).nullable().optional(),
	Anteilshaber: z.array(
		AnteilshaberValidator
	).nullable().optional()
}))

/**
 * Runtime überprüfung für den Verbrauchsausweis Wohnen
 * Dieser Typ beinhaltet alle Daten bis auf die IDs aller Verlinkungen.
 */
export const VerbrauchsausweisWohnenValidator =
	VerbrauchsausweisWohnenSchema.merge(
		z.object({
			benutzer: BenutzerSchema.omit({
				id: true,
				passwort: true
			}),
			aufnahme: AufnahmeSchema.omit({
				benutzer_id: true,
				objekt_id: true,
				id: true,
			}).merge(
				z.object({
					objekt: ObjektSchema.omit({
						benutzer_id: true,
						id: true,
					}).merge(
						z.object({
							bilder: z.array(
								BildSchema.omit({
									id: true,
									objekt_id: true,
								})
							)
						})
					),
					rechnungen: RechnungSchema.omit({
						aufnahme_id: true,
						benutzer_id: true,
						id: true,
					}).array(),
					events: z.array(
						EventSchema.omit({
							aufnahme_id: true,
							id: true,
							benutzer_id: true
						}).merge(z.object({
							benutzer: BenutzerSchema.pick({
								uid: true
							})
						}))
					)
				})
			)
		})
	).omit({
		benutzer_id: true,
		id: true,
		aufnahme_id: true,
	});

	export const VerbrauchsausweisWohnenBerechnungValidator2024 = z.object({
		endEnergieVerbrauchGesamt: z.number(),
		primaerEnergieVerbrauchGesamt: z.number(),
		energieEffizienzKlasse: z.string(),
		co2EmissionenGesamt: z.number()
	})

	/**
 * Runtime überprüfung für den Verbrauchsausweis Wohnen
 * Dieser Typ beinhaltet alle Daten bis auf die IDs aller Verlinkungen.
 */
export const BedarfsausweisWohnenValidator =
BedarfsausweisWohnenSchema.merge(
	z.object({
		aufnahme: AufnahmeSchema.omit({
			benutzer_id: true,
			objekt_id: true,
			id: true,
		}).merge(
			z.object({
				objekt: ObjektSchema.omit({
					benutzer_id: true,
					id: true,
				}).merge(
					z.object({
						bilder: z.array(
							BildSchema.omit({
								id: true,
								objekt_id: true,
							})
						)
					})
				),
				rechnungen: RechnungSchema.omit({
					aufnahme_id: true,
					benutzer_id: true,
					id: true,
				}).array(),
				events: z.array(
					EventSchema.omit({
						aufnahme_id: true,
						id: true,
						benutzer_id: true
					}).merge(z.object({
						benutzer: BenutzerSchema.pick({
							uid: true
						})
					}))
				)
			})
		)
	})
).omit({
	benutzer_id: true,
	id: true,
	aufnahme_id: true,
});

/**
 * Runtime überprüfung für den Verbrauchsausweis Wohnen
 * Dieser Typ beinhaltet alle Daten bis auf die IDs aller Verlinkungen.
 */
export const VerbrauchsausweisGewerbeValidator =
	VerbrauchsausweisGewerbeSchema.merge(
		z.object({
			aufnahme: AufnahmeSchema.omit({
				benutzer_id: true,
				objekt_id: true,
				id: true,
			}).merge(
				z.object({
					objekt: ObjektSchema.omit({
						benutzer_id: true,
						id: true,
					}).merge(
						z.object({
							bilder: z.array(
								BildSchema.omit({
									id: true,
									objekt_id: true,
								})
							)
						})
					),
					rechnungen: RechnungSchema.omit({
						aufnahme_id: true,
						benutzer_id: true,
						id: true,
					}).array(),
					events: z.array(
						EventSchema.omit({
							aufnahme_id: true,
							id: true,
							benutzer_id: true
						}).merge(z.object({
							benutzer: BenutzerSchema.pick({
								uid: true
							})
						}))
					)
				})
			)
		})
	).omit({
		benutzer_id: true,
		id: true,
		aufnahme_id: true,
	});