// Copyright (c) 2012, Miron Brezuleanu
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//     * Redistributions of source code must retain the above copyright
//       notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above copyright
//       notice, this list of conditions and the following disclaimer in the
//       documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;

namespace Shovel.Compiler.Types
{
    public class Position
    {
        public string FileName { get; set; }

        public int Line { get; set; }

        public int Column{ get; set; }

        public static Position CalculatePosition(SourceFile source, int pos)
        {
            if (pos >= source.Content.Length) {
                throw new InvalidOperationException (
                    "The character position specified is not inside the provided content.");
            }
            var result = new Position () { 
                FileName = source.FileName,
                Line = 1,
                Column = 1
            };
            for (var i = 0; i <= pos; i++) {
                var ch = source.Content [i];
                if (ch == '\n') {
                    result.Line ++;
                    result.Column = 1;
                }
                if (ch != '\n' && ch != '\r') {
                    result.Column ++;
                }
            }
            result.Column --;
            return result;
        }

    }
}

