using System;

namespace P4API
{
    internal class P4ResultCallback : P4Callback
    {
        private P4BaseRecordSet _P4Result;
        
        public P4ResultCallback(P4BaseRecordSet p4Result)
        {
            this._P4Result = p4Result;
        }


        #region P4Callback Members

        public override void SetSpecDef(string specDef)
        {
            _P4Result.SpecDef = specDef;
        }

        public override void Diff(System.IO.FileInfo f1, System.IO.FileInfo f2, string diffFlags)
        {
            throw new Exceptions.DiffNotImplemented();
        }

        public override void Edit(System.IO.FileInfo f1)
        {
            throw new P4API.Exceptions.FormCommandException();
        }

        public override void Prompt(string msg, ref string rsp)
        {
            rsp = _P4Result.RaiseOnPromptEvent(msg);
        }

        public override void Merge(System.IO.FileInfo baseFile, System.IO.FileInfo leg1, System.IO.FileInfo leg2, System.IO.FileInfo result)
        {
            throw new Exceptions.MergeNotImplemented();
        }

        public override void Finished()
        {
            // no need to do anything
        }

        public override void OutputInfo(string data)
        {
            _P4Result.AddInfo(data);
        }

        public override bool Cancel()
        {
            return false;
        }

        public override void OutputBinary(byte[] b)
        {
            _P4Result.BinaryOutput = b;
        }

        public override void OutputText(string data)
        {
            _P4Result.AddInfo(data);
        }

        public override void InputData(System.Text.StringBuilder buffer)
        {
            buffer.Append(_P4Result.InputData);
        }

        public override void OutputRecord(P4Record record)
        {
            _P4Result.AddRecord(record);
        }

        public override void OutputMessage(P4Message message)
        {
            //Console.WriteLine("{0}: {1}", (int)message.Severity, message.Identity);
            switch (message.Severity)
            {
                case P4MessageSeverity.Empty: // E_EMPTY (0) | no error 
                    _P4Result.AddString(message.Format());
                    break;
                case P4MessageSeverity.Info: // E_INFO  (1) | information, not necessarily an error 
                    _P4Result.AddInfo(message.Format());
                    break;
                case P4MessageSeverity.Warning: // E_WARN  (2) | a minor error occurred 
                    _P4Result.AddWarning(message.Format());
                    break;
                case P4MessageSeverity.Failed: // E_FAILED(3) | the command was used incorrectly 
                    _P4Result.AddError(message.Format());
                    break;
                case P4MessageSeverity.Fatal: // E_FATAL (4) | fatal error, the command can't be processed 
                    _P4Result.AddError(message.Format());
                    break;
                default:
                    //TODO throw an error... unknown severity
                    break;
            }
        }

        #endregion
    }
}