/*
 * Copyright (c) 2018 by Nicolas Märchy
 *
 * This file is part of Sporttag PSA.
 *
 * Sporttag PSA is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Sporttag PSA is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Sporttag PSA.  If not, see <http://www.gnu.org/licenses/>.
 *
 * Diese Datei ist Teil von Sporttag PSA.
 *
 * Sporttag PSA ist Freie Software: Sie können es unter den Bedingungen
 * der GNU General Public License, wie von der Free Software Foundation,
 * Version 3 der Lizenz oder (nach Ihrer Wahl) jeder späteren
 * veröffentlichten Version, weiterverbreiten und/oder modifizieren.
 *
 * Sporttag PSA wird in der Hoffnung, dass es nützlich sein wird, aber
 * OHNE JEDE GEWÄHRLEISTUNG, bereitgestellt; sogar ohne die implizite
 * Gewährleistung der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK.
 * Siehe die GNU General Public License für weitere Details.
 *
 * Sie sollten eine Kopie der GNU General Public License zusammen mit diesem
 * Programm erhalten haben. Wenn nicht, siehe <http://www.gnu.org/licenses/>.
 *
 *
 */

package ch.schulealtendorf.psa.service.group.business

import ch.schulealtendorf.psa.service.group.business.parsing.FlatParticipant
import ch.schulealtendorf.psa.service.standard.entity.CoachEntity
import ch.schulealtendorf.psa.service.standard.entity.GroupEntity
import ch.schulealtendorf.psa.service.standard.entity.ParticipantEntity
import ch.schulealtendorf.psa.service.standard.entity.TownEntity
import ch.schulealtendorf.psa.service.standard.repository.CoachRepository
import ch.schulealtendorf.psa.service.standard.repository.GroupRepository
import ch.schulealtendorf.psa.service.standard.repository.ParticipantRepository
import ch.schulealtendorf.psa.service.standard.repository.TownRepository
import mu.KotlinLogging
import org.springframework.stereotype.Component

/**
 * A {@link GroupManager} which uses repositories to process its data.
 *
 * @author nmaerchy <billedtrain380@gmail.com>
 * @since 2.0.0
 */
@Component
class GroupImportManagerImpl(
    private val groupRepository: GroupRepository,
    private val participantRepository: ParticipantRepository,
    private val coachRepository: CoachRepository,
    private val townRepository: TownRepository
) : GroupImportManager {
    private val log = KotlinLogging.logger {}

    override fun import(participant: FlatParticipant) {
        log.debug { "Import Participant ${participant.prename} ${participant.surname}" }

        val town = townRepository.findByZipAndName(participant.zipCode, participant.town)
            .orElseGet { TownEntity(zip = participant.zipCode, name = participant.town) }

        val coach = coachRepository.findByName(participant.coach)
            .orElseGet { CoachEntity(name = participant.coach) }

        val group = groupRepository.findByName(participant.group)
            .orElseGet { GroupEntity(participant.group, coach) }

        val participantEntity = ParticipantEntity(
            surname = participant.surname,
            prename = participant.prename,
            gender = participant.gender,
            birthday = participant.birthday.value,
            address = participant.address,
            town = town,
            group = group
        )

        participantRepository.save(participantEntity)
    }
}
