/***************************************************************************
The Disc Image Chef
----------------------------------------------------------------------------
 
Filename       : Options.cs
Version        : 1.0
Author(s)      : Natalia Portillo
 
Component      : Main program loop.

Revision       : $Revision$
Last change by : $Author$
Date           : $Date$
 
--[ Description ] ----------------------------------------------------------
 
Defines verbs and options.
 
--[ License ] --------------------------------------------------------------
 
    This program 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.

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

----------------------------------------------------------------------------
Copyright (C) 2011-2014 Claunia.com
****************************************************************************/
//$Id$
using CommandLine;
using CommandLine.Text;

namespace DiscImageChef
{
    public abstract class CommonSubOptions
    {
        [Option('v', "verbose", DefaultValue = false, HelpText = "Shows verbose output")]
        public bool Verbose { get; set; }

        [Option('d', "debug", DefaultValue = false, HelpText = "Shows debug output from plugins")]
        public bool Debug { get; set; }
    }

    public class AnalyzeSubOptions : CommonSubOptions
    {
        [Option('p', "partitions", DefaultValue = true,
            HelpText = "Searches and interprets partitions.")]
        public bool SearchForPartitions { get; set; }

        [Option('f', "filesystems", DefaultValue = true,
            HelpText = "Searches and interprets partitions.")]
        public bool SearchForFilesystems { get; set; }

        [Option('i', "input", Required = true, HelpText = "Disc image.")]
        public string InputFile { get; set; }
    }

    public class CompareSubOptions : CommonSubOptions
    {
        [Option("input1", Required = true, HelpText = "First disc image.")]
        public string InputFile1 { get; set; }

        [Option("input2", Required = true, HelpText = "Second disc image.")]
        public string InputFile2 { get; set; }
    }

    public class ChecksumSubOptions : CommonSubOptions
    {
        [Option('t', "separated-tracks", DefaultValue = true,
            HelpText = "Checksums each track separately.")]
        public bool SeparatedTracks { get; set; }

        [Option('w', "whole-disc", DefaultValue = true,
            HelpText = "Checksums the whole disc.")]
        public bool WholeDisc { get; set; }

        [Option('c', "crc32", DefaultValue = true,
            HelpText = "Calculates CRC32.")]
        public bool DoCRC32 { get; set; }

        [Option("crc64", DefaultValue = false,
            HelpText = "Calculates CRC64 (ECMA).")]
        public bool DoCRC64 { get; set; }

        [Option('m', "md5", DefaultValue = true,
            HelpText = "Calculates MD5.")]
        public bool DoMD5 { get; set; }

        [Option("ripemd160", DefaultValue = false,
            HelpText = "Calculates RIPEMD160.")]
        public bool DoRIPEMD160 { get; set; }

        [Option('s', "sha1", DefaultValue = true,
            HelpText = "Calculates SHA1.")]
        public bool DoSHA1 { get; set; }

        [Option("sha256", DefaultValue = false,
            HelpText = "Calculates SHA256.")]
        public bool DoSHA256 { get; set; }

        [Option("sha384", DefaultValue = false,
            HelpText = "Calculates SHA384.")]
        public bool DoSHA384 { get; set; }

        [Option("sha512", DefaultValue = false,
            HelpText = "Calculates SHA512.")]
        public bool DoSHA512 { get; set; }

        [Option('i', "input", Required = true, HelpText = "Disc image.")]
        public string InputFile { get; set; }
    }

    public class VerifySubOptions : CommonSubOptions
    {
        [Option('w', "verify-disc", DefaultValue = true,
            HelpText = "Verify disc image if supported.")]
        public bool VerifyDisc { get; set; }

        [Option('s', "verify-sectors", DefaultValue = true,
            HelpText = "Verify all sectors if supported.")]
        public bool VerifySectors { get; set; }

        [Option('i', "input", Required = true, HelpText = "Disc image.")]
        public string InputFile { get; set; }
    }

    public class FormatsSubOptions : CommonSubOptions
    {
    }

    public class Options
    {
        public Options()
        {
            AnalyzeVerb = new AnalyzeSubOptions();
            CompareVerb = new CompareSubOptions();
            ChecksumVerb = new ChecksumSubOptions();
            VerifyVerb = new VerifySubOptions();
            FormatsVerb = new FormatsSubOptions();
        }

        [VerbOption("analyze", HelpText = "Analyzes a disc image and searches for partitions and/or filesystems.")]
        public AnalyzeSubOptions AnalyzeVerb { get; set; }

        [VerbOption("compare", HelpText = "Compares two disc images.")]
        public CompareSubOptions CompareVerb { get; set; }

        [VerbOption("checksum", HelpText = "Checksums an image.")]
        public ChecksumSubOptions ChecksumVerb { get; set; }

        [VerbOption("verify", HelpText = "Verifies a disc image integrity, and if supported, sector integrity.")]
        public VerifySubOptions VerifyVerb { get; set; }

        [VerbOption("formats", HelpText = "Lists all supported disc images, partition schemes and file systems.")]
        public FormatsSubOptions FormatsVerb { get; set; }

        [HelpVerbOption]
        public string DoHelpForVerb(string verbName)
        {
            return HelpText.AutoBuild(this, verbName);
        }

    }
}

