/*
 This file is part of Airsonic.

 Airsonic 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.

 Airsonic 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 Airsonic.  If not, see <http://www.gnu.org/licenses/>.

 Copyright 2016 (C) Airsonic Authors
 Based upon Subsonic, Copyright 2009 (C) Sindre Mehus
 */
package org.airsonic.player.domain;

import org.airsonic.player.util.StringUtil;

import java.util.Objects;

/**
 * Contains the configuration for a transcoding, i.e., a specification of how a given media format
 * should be converted to another.
 * <br/>
 * A transcoding may contain up to three steps. Typically you need to convert in several steps, for
 * instance from OGG to WAV to MP3.
 *
 * @author Sindre Mehus
 */
public class Transcoding {

    private Integer id;
    private String name;
    private String sourceFormats;
    private String targetFormat;
    private String step1;
    private String step2;
    private String step3;
    private boolean defaultActive;

    /**
     * Creates a new transcoding specification.
     *
     * @param id              The system-generated ID.
     * @param name            The user-defined name.
     * @param sourceFormats   The source formats, e.g., "ogg wav aac".
     * @param targetFormat    The target format, e.g., "mp3".
     * @param step1           The command to execute in step 1.
     * @param step2           The command to execute in step 2.
     * @param step3           The command to execute in step 3.
     * @param defaultActive   Whether the transcoding should be automatically activated for all players.
     */
    public Transcoding(Integer id, String name, String sourceFormats, String targetFormat, String step1,
            String step2, String step3, boolean defaultActive) {
        this.id = id;
        this.name = name;
        this.sourceFormats = sourceFormats;
        this.targetFormat = targetFormat;
        this.step1 = step1;
        this.step2 = step2;
        this.step3 = step3;
        this.defaultActive = defaultActive;
    }

    /**
     * Returns the system-generated ID.
     *
     * @return The system-generated ID.
     */
    public Integer getId() {
        return id;
    }

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

    /**
     * Returns the user-defined name.
     *
     * @return The user-defined name.
     */
    public String getName() {
        return name;
    }

    /**
     * Sets the user-defined name.
     *
     * @param name The user-defined name.
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * Returns the source format, e.g., "ogg wav aac".
     *
     * @return The source format, e.g., "ogg wav aac".
     */
    public String getSourceFormats() {
        return sourceFormats;
    }

    public String[] getSourceFormatsAsArray() {
        return StringUtil.split(sourceFormats);
    }

    /**
     * Sets the source formats, e.g., "ogg wav aac".
     *
     * @param sourceFormats The source formats, e.g., "ogg wav aac".
     */
    public void setSourceFormats(String sourceFormats) {
        this.sourceFormats = sourceFormats;
    }

    /**
     * Returns the target format, e.g., mp3.
     *
     * @return The target format, e.g., mp3.
     */
    public String getTargetFormat() {
        return targetFormat;
    }

    /**
     * Sets the target format, e.g., mp3.
     *
     * @param targetFormat The target format, e.g., mp3.
     */
    public void setTargetFormat(String targetFormat) {
        this.targetFormat = targetFormat;
    }

    /**
     * Returns the command to execute in step 1.
     *
     * @return The command to execute in step 1.
     */
    public String getStep1() {
        return step1;
    }

    /**
     * Sets the command to execute in step 1.
     *
     * @param step1 The command to execute in step 1.
     */
    public void setStep1(String step1) {
        this.step1 = step1;
    }

    /**
     * Returns the command to execute in step 2.
     *
     * @return The command to execute in step 2.
     */
    public String getStep2() {
        return step2;
    }

    /**
     * Sets the command to execute in step 2.
     *
     * @param step2 The command to execute in step 2.
     */
    public void setStep2(String step2) {
        this.step2 = step2;
    }

    /**
     * Returns the command to execute in step 3.
     *
     * @return The command to execute in step 3.
     */
    public String getStep3() {
        return step3;
    }

    /**
     * Sets the command to execute in step 3.
     *
     * @param step3 The command to execute in step 3.
     */
    public void setStep3(String step3) {
        this.step3 = step3;
    }

    /**
     * Returns whether the transcoding should be automatically activated for all players
     */
    public boolean isDefaultActive() {
        return defaultActive;
    }

    /**
     * Sets whether the transcoding should be automatically activated for all players
     */
    public void setDefaultActive(boolean defaultActive) {
        this.defaultActive = defaultActive;
    }

    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }

        Transcoding that = (Transcoding) o;
        return Objects.equals(id, that.id);
    }

    public int hashCode() {
        return (id != null ? id.hashCode() : 0);
    }
}
