/*
 * AviOutput.cs
 * Copyright (c) 2007-2009 kbinani
 *
 * This file is part of LipSync.
 *
 * LipSync is free software; you can redistribute it and/or
 * modify it under the terms of the BSD License.
 *
 * LipSync 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.
 */
using System;
using System.IO;
using System.Windows.Forms;
using System.Drawing;

using Boare.Lib.AppUtil;

namespace LipSync {

    public partial class AviOutput : Form, IMultiLanguageControl {
        private bool m_raw_mode = false;
        private float m_start = 0f;
        private float m_end = 0f;

        public AviOutput( bool raw_mode ) {
            InitializeComponent();
            ApplyLanguage();
            ApplyFont( AppManager.Config.Font.GetFont() );
            m_raw_mode = raw_mode;
            if ( groupAudio.Enabled ) {
                if ( File.Exists( AppManager.SaveData.m_audioFile ) ) {
                    this.chkMergeAudio.Enabled = true;
                } else {
                    this.chkMergeAudio.Enabled = false;
                }
            }
            if ( m_raw_mode ) {
                radioVcm.Enabled = false;
                radioVfw.Enabled = false;
                radioVcm.Checked = true;
                btnVideoCompression.Enabled = false;
                txtDescription.Enabled = false;
            } else {
                radioVcm.Enabled = true;
                radioVfw.Enabled = true;
                btnVideoCompression.Enabled = true;
                txtDescription.Enabled = true;
            }
            txtFile.Text = AppManager.Config.LastAviPath;
            JudgeWritable();
        }

        public void ApplyFont( Font font ) {
            this.Font = font;
            foreach ( Control c in this.Controls ) {
                Boare.Lib.AppUtil.Misc.ApplyFontRecurse( c, font );
            }
        }

        public void ApplyLanguage() {
            btnCancel.Text = _( "Cancel" );
            btnOK.Text = _( "Save" );
            lblFileName.Text = _( "File Name" );
            if ( AppManager.Config.PathFFmpeg != "" && File.Exists( AppManager.Config.PathFFmpeg ) ) {
                groupAudio.Text = _( "Audio" );
                groupAudio.Enabled = true;
            } else {
                groupAudio.Text = _( "Audio" ) + " (" + _( "Set the path of ffmpeg to enable this option" ) + ")";
                groupAudio.Enabled = false;
            }
            if ( AppManager.Config.PathMEncoder != "" && File.Exists( AppManager.Config.PathMEncoder ) ) {
                groupFlv.Text = _( "FLV and MP4" );
                groupFlv.Enabled = true;
            } else {
                groupFlv.Text = _( "FLV and MP4" ) + " (" + _( "Set the path of mencoder and ffmpeg to enable this option" ) + ")";
                groupFlv.Enabled = false;
            }
            chkFLV.Text = _( "Convert to FLV" );
            chkMP4.Text = _( "Convert to MP4" );
            chkMergeAudio.Text = _( "Merge WAVE to AVI" );
            chkDeleteIntermediate.Text = _( "Delete Intermediate File" );
            btnVideoCompression.Text = _( "Video Compression" );
            groupStartEnd.Text = _( "Specify Output Range" );
            chkStart.Text = _( "Start" );
            chkEnd.Text = _( "End" );
            checkContainsAlpha.Text = _( "Add Alpha" );
        }

        public static string _( string s ) {
            return Messaging.GetMessage( s );
        }

        public AviOutputArguments Arguments {
            get {
                AviOutputArguments aoa = new AviOutputArguments();
                aoa.AviFile = this.FileName;
                aoa.End = m_end;
                aoa.EndSpecified = chkEnd.Checked;
                aoa.FileNameParser = "";
                aoa.ImageFormat = null;
                aoa.IsDeleteIntermediateRequired = chkDeleteIntermediate.Checked;
                aoa.IsFlvEncodeRequired = chkFLV.Checked;
                aoa.IsMp4EncodeRequired = chkMP4.Checked;
                if ( aoa.IsMp4EncodeRequired && aoa.IsFlvEncodeRequired ) {
                    aoa.IsFlvEncodeRequired = false;
                }
                aoa.IsTransparent = checkContainsAlpha.Checked;
                aoa.IsWaveMergeRequired = chkMergeAudio.Checked;
                aoa.Start = m_start;
                aoa.StartSpecified = chkStart.Checked;
                aoa.UseVfwEncoder = radioVfw.Checked;
                return aoa;
            }
        }

        private void btnOK_Click( object sender, EventArgs e ) {
            //ディレクトリが存在するかどうかを確認
            string name = FileName;
            if ( !Directory.Exists( Path.GetDirectoryName( name ) ) ) {
                MessageBox.Show( string.Format( _( "Directory {0} does not exist." ), Path.GetDirectoryName( name ) ),
                                 _( "Error" ),
                                 MessageBoxButtons.OK,
                                 MessageBoxIcon.Exclamation );
                return;
            }

            //既にファイルが存在することを警告
            if ( File.Exists( name ) ) {
                if ( MessageBox.Show( string.Format( _( "{0} already exists.\nDo you want to replace it?" ), name ),
                                      "LipSync",
                                      MessageBoxButtons.YesNo,
                                      MessageBoxIcon.Exclamation ) == DialogResult.No ) {
                    return;
                }
            }
            try {
                m_start = float.Parse( txtStart.Text );
                m_end = float.Parse( txtEnd.Text );
                this.DialogResult = DialogResult.OK;
            } catch ( Exception ex ) {
                MessageBox.Show( _( "Invalid value has been entered" ),
                                 _( "Error" ),
                                 MessageBoxButtons.OK,
                                 MessageBoxIcon.Exclamation );
                Common.LogPush( ex );
            }
        }

        private string FileName {
            get {
                if ( Path.GetExtension( txtFile.Text ).ToLower() != ".avi" ) {
                    string name = txtFile.Text;
                    txtFile.Text = Path.Combine( Path.GetDirectoryName( name ), Path.GetFileNameWithoutExtension( name ) + ".avi" );
                }
                return txtFile.Text;
            }
        }

        private void btnFile_Click( object sender, EventArgs e ) {
            using ( SaveFileDialog dlg = new SaveFileDialog() ) {
                if ( AppManager.Config.LastAviPath != "" ) {
                    try {
                        dlg.InitialDirectory = Path.GetDirectoryName( AppManager.Config.LastAviPath );
                    } catch {
                    }
                }
                try {
                    dlg.Filter = _( "Avi file(*.avi)|*.avi" ) + "|" + _( "All Files(*.*)|*.*" );
                } catch {
                    dlg.Filter = "Avi file(*.avi)|*.avi|All Files(*.*)|*.*";
                }
                dlg.OverwritePrompt = false;
                if ( dlg.ShowDialog() == DialogResult.OK ) {
                    AppManager.Config.LastAviPath = dlg.FileName;
                    txtFile.Text = dlg.FileName;
                    JudgeWritable();
                }
            }
        }

        private void JudgeWritable() {
            if ( txtFile.Text != "" ) {
                btnOK.Enabled = true;
            } else {
                btnOK.Enabled = false;
            }
        }

        private void chkStart_CheckedChanged( object sender, EventArgs e ) {
            txtStart.Enabled = chkStart.Checked;
            if ( txtStart.Enabled ) {
                txtStart.Focus();
            }
        }

        private void checkBox1_CheckedChanged( object sender, EventArgs e ) {
            txtEnd.Enabled = chkEnd.Checked;
            if ( txtEnd.Enabled ) {
                txtEnd.Focus();
            }
        }

        private void chkFLV_CheckedChanged( object sender, EventArgs e ) {
            if ( chkFLV.Checked && chkMP4.Checked ) {
                chkMP4.Checked = false;
            }
            this.chkDeleteIntermediate.Enabled = chkFLV.Checked | chkMP4.Checked | chkMergeAudio.Checked;
        }

        private void chkMP4_CheckedChanged( object sender, EventArgs e ) {
            if ( chkMP4.Checked && chkFLV.Checked ) {
                chkFLV.Checked = false;
            }
            this.chkDeleteIntermediate.Enabled = chkFLV.Checked | chkMP4.Checked | chkMergeAudio.Checked;
        }

        private void chkMergeAudio_CheckedChanged( object sender, EventArgs e ) {
            this.chkDeleteIntermediate.Enabled = chkFLV.Checked | chkMP4.Checked | chkMergeAudio.Checked;
        }
    }

}
