package projetMusee.backend;

import java.util.List;

/**
 * La classe Museum représente un musée avec toutes ses informations.
 *
 * @requires Les paramètres passés au constructeur doivent être conformes aux
 *           types attendus (par exemple, creationYear doit être un entier
 *           valide, les Strings non nulles, etc.).
 * @ensures Un objet Museum est correctement initialisé avec tous ses attributs.
 */
public class Museum {
    // Attributs privés
    private String id;
    private String officialName;
    private String address;
    private String place;
    private String postalCode;
    private String city;
    private String region;
    private String department;
    private String url;
    private String phone;
    private String category;
    private List<String> thematicDomain;
    private String history;
    private String asset;
    private String themes;
    private String artist;
    private String keyFigure;
    private String interest;
    private String buildingProtection;
    private String spaceProtection;
    private String refmer;
    private int creationYear;
    private String lastUpdatedDate;
    private Coordinates coordinates;

    /**
     * Constructeur complet pour initialiser un objet Museum.
     *
     * @param id                 L'identifiant du musée.
     * @param officialName       Le nom officiel du musée.
     * @param address            L'adresse du musée.
     * @param place              Le lieu (complément d'adresse) du musée.
     * @param postalCode         Le code postal du musée.
     * @param city               La ville où se trouve le musée.
     * @param region             La région du musée.
     * @param department         Le département du musée.
     * @param url                L'URL du musée.
     * @param phone              Le numéro de téléphone du musée.
     * @param category           La catégorie du musée.
     * @param thematicDomain     La liste des domaines thématiques du musée.
     * @param history            L'histoire du musée.
     * @param asset              Les atouts ou points forts du musée.
     * @param themes             Les thèmes associés au musée.
     * @param artist             L'artiste associé (si applicable).
     * @param keyFigure          La personnalité phare associée au musée.
     * @param interest           L'intérêt du musée (par exemple, description
     *                           architecturale).
     * @param buildingProtection La protection du bâtiment.
     * @param spaceProtection    La protection de l'espace.
     * @param refmer             La référence MER du musée.
     * @param creationYear       L'année de création du musée.
     * @param lastUpdatedDate    La date de dernière mise à jour des informations.
     * @param coordinates        Les coordonnées géographiques du musée.
     *
     * @requires Tous les paramètres doivent être fournis et validés (par exemple,
     *           id non nul, creationYear positif, etc.).
     * @ensures L'objet Museum est instancié avec les valeurs fournies.
     */
    public Museum(String id, String officialName, String address, String place, String postalCode, String city,
            String region, String department, String url, String phone, String category,
            List<String> thematicDomain, String history, String asset, String themes, String artist,
            String keyFigure, String interest, String buildingProtection, String spaceProtection,
            String refmer, int creationYear, String lastUpdatedDate, Coordinates coordinates) {

        // Validation des préconditions
        if (id == null || id.isEmpty())
            throw new IllegalArgumentException("L'id ne peut pas être nul ou vide.");
        if (officialName == null || officialName.isEmpty())
            throw new IllegalArgumentException("Le nom officiel ne peut pas être nul ou vide.");
      //  if (creationYear <= 0)
        //    throw new IllegalArgumentException("L'année de création doit être un entier positif.");
       // if (thematicDomain == null || thematicDomain.isEmpty())
         //   throw new IllegalArgumentException("Les domaines thématiques ne peuvent pas être nuls ou vides.");

        // Initialisation des attributs
        this.id = id;
        this.officialName = officialName;
        this.address = address;
        this.place = place;
        this.postalCode = postalCode;
        this.city = city;
        this.region = region;
        this.department = department;
        this.url = url;
        this.phone = phone;
        this.category = category;
        this.thematicDomain = thematicDomain;
        this.history = history;
        this.asset = asset;
        this.themes = themes;
        this.artist = artist;
        this.keyFigure = keyFigure;
        this.interest = interest;
        this.buildingProtection = buildingProtection;
        this.spaceProtection = spaceProtection;
        this.refmer = refmer;
        this.creationYear = creationYear;
        this.lastUpdatedDate = lastUpdatedDate;
        this.coordinates = coordinates;
    }

    // Getters et setters

    public Museum(String string, String string2, String string3, String string4, String string5, int i) {
        //TODO Auto-generated constructor stub
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getOfficialName() {
        return officialName;
    }

    public void setOfficialName(String officialName) {
        this.officialName = officialName;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getPlace() {
        return place;
    }

    public void setPlace(String place) {
        this.place = place;
    }

    public String getPostalCode() {
        return postalCode;
    }

    public void setPostalCode(String postalCode) {
        this.postalCode = postalCode;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getRegion() {
        return region;
    }

    public void setRegion(String region) {
        this.region = region;
    }

    public String getDepartment() {
        return department;
    }

    public void setDepartment(String department) {
        this.department = department;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }

    public List<String> getThematicDomain() {
        return thematicDomain;
    }

    public void setThematicDomain(List<String> thematicDomain) {
        this.thematicDomain = thematicDomain;
    }

    public String getHistory() {
        return history;
    }

    public void setHistory(String history) {
        this.history = history;
    }

    public String getAsset() {
        return asset;
    }

    public void setAsset(String asset) {
        this.asset = asset;
    }

    public String getThemes() {
        return themes;
    }

    public void setThemes(String themes) {
        this.themes = themes;
    }

    public String getArtist() {
        return artist;
    }

    public void setArtist(String artist) {
        this.artist = artist;
    }

    public String getKeyFigure() {
        return keyFigure;
    }

    public void setKeyFigure(String keyFigure) {
        this.keyFigure = keyFigure;
    }

    public String getInterest() {
        return interest;
    }

    public void setInterest(String interest) {
        this.interest = interest;
    }

    public String getBuildingProtection() {
        return buildingProtection;
    }

    public void setBuildingProtection(String buildingProtection) {
        this.buildingProtection = buildingProtection;
    }

    public String getSpaceProtection() {
        return spaceProtection;
    }

    public void setSpaceProtection(String spaceProtection) {
        this.spaceProtection = spaceProtection;
    }

    public String getRefmer() {
        return refmer;
    }

    public void setRefmer(String refmer) {
        this.refmer = refmer;
    }

    public int getCreationYear() {
        return creationYear;
    }

    public void setCreationYear(int creationYear) {
        this.creationYear = creationYear;
    }

    public String getLastUpdatedDate() {
        return lastUpdatedDate;
    }

    public void setLastUpdatedDate(String lastUpdatedDate) {
        this.lastUpdatedDate = lastUpdatedDate;
    }

    public Coordinates getCoordinates() {
        return coordinates;
    }

    public void setCoordinates(Coordinates coordinates) {
        this.coordinates = coordinates;
    }

    /**
     * Retourne une représentation textuelle de l'objet Museum.
     *
     * @return Une chaîne de caractères décrivant le musée.
     *
     * @ensures Retourne une chaîne non nulle contenant les principales informations
     *          du musée.
     */
    @Override
    public String toString() {
        return "Museum{" +
                "id='" + id + '\'' +
                ", officialName='" + officialName + '\'' +
                ", address='" + address + '\'' +
                ", place='" + place + '\'' +
                ", postalCode='" + postalCode + '\'' +
                ", city='" + city + '\'' +
                ", region='" + region + '\'' +
                ", department='" + department + '\'' +
                ", url='" + url + '\'' +
                ", phone='" + phone + '\'' +
                ", category='" + category + '\'' +
                ", thematicDomain=" + thematicDomain +
                ", history='" + history + '\'' +
                ", asset='" + asset + '\'' +
                ", themes='" + themes + '\'' +
                ", artist='" + artist + '\'' +
                ", keyFigure='" + keyFigure + '\'' +
                ", interest='" + interest + '\'' +
                ", buildingProtection='" + buildingProtection + '\'' +
                ", spaceProtection='" + spaceProtection + '\'' +
                ", refmer='" + refmer + '\'' +
                ", creationYear=" + creationYear +
                ", lastUpdatedDate='" + lastUpdatedDate + '\'' +
                ", coordinates=" + coordinates +
                '}';
    }
}