    ﻿using System;

    namespace Nikse.SubtitleEdit.Core
    {
        public class Paragraph
        {
            public int Number { get; set; }

            public string Text { get; set; }

            public TimeCode StartTime { get; set; }

            public TimeCode EndTime { get; set; }

            public TimeCode Duration
            {
                get
                {
                    return new TimeCode(EndTime.TotalMilliseconds - StartTime.TotalMilliseconds);
                }
            }

            public int StartFrame { get; set; }

            public int EndFrame { get; set; }

            public bool Forced { get; set; }

            public string Extra { get; set; }

            public bool IsComment { get; set; }

            public string Actor { get; set; }
            public string Region { get; set; }

            public string MarginL { get; set; }
            public string MarginR { get; set; }
            public string MarginV { get; set; }

            public string Effect { get; set; }

            public int Layer { get; set; }

            public string ID { get; private set; }

            public string Language { get; set; }

            public string Style { get; set; }

            public bool NewSection { get; set; }

            private string GenerateId()
            {
                return Guid.NewGuid().ToString();
            }

            public Paragraph()
            {
                StartTime = TimeCode.FromSeconds(0);
                EndTime = TimeCode.FromSeconds(0);
                Text = string.Empty;
                ID = GenerateId();
            }

            public Paragraph(TimeCode startTime, TimeCode endTime, string text)
            {
                StartTime = startTime;
                EndTime = endTime;
                Text = text;
                ID = GenerateId();
            }

            public Paragraph(Paragraph paragraph, bool generateNewId = true)
            {
                Number = paragraph.Number;
                Text = paragraph.Text;
                StartTime = new TimeCode(paragraph.StartTime.TotalMilliseconds);
                EndTime = new TimeCode(paragraph.EndTime.TotalMilliseconds);
                StartFrame = paragraph.StartFrame;
                EndFrame = paragraph.EndFrame;
                Forced = paragraph.Forced;
                Extra = paragraph.Extra;
                IsComment = paragraph.IsComment;
                Actor = paragraph.Actor;
                Region = paragraph.Region;
                MarginL = paragraph.MarginL;
                MarginR = paragraph.MarginR;
                MarginV = paragraph.MarginV;
                Effect = paragraph.Effect;
                Layer = paragraph.Layer;
                ID = generateNewId ? GenerateId() : paragraph.ID;
                Language = paragraph.Language;
                Style = paragraph.Style;
                NewSection = paragraph.NewSection;
            }

            public Paragraph(int startFrame, int endFrame, string text)
            {
                StartTime = new TimeCode();
                EndTime = new TimeCode();
                StartFrame = startFrame;
                EndFrame = endFrame;
                Text = text;
                ID = GenerateId();
            }

            public Paragraph(string text, double startTotalMilliseconds, double endTotalMilliseconds)
            {
                StartTime = new TimeCode(startTotalMilliseconds);
                EndTime = new TimeCode(endTotalMilliseconds);
                Text = text;
                ID = GenerateId();
            }

            public void Adjust(double factor, double adjustmentInSeconds)
            {
                if (StartTime.IsMaxTime)
                    return;

                StartTime.TotalMilliseconds = StartTime.TotalMilliseconds * factor + (adjustmentInSeconds * TimeCode.BaseUnit);
                EndTime.TotalMilliseconds = EndTime.TotalMilliseconds * factor + (adjustmentInSeconds * TimeCode.BaseUnit);
            }

            public void CalculateFrameNumbersFromTimeCodes(double frameRate)
            {
                StartFrame = (int)Math.Round((StartTime.TotalMilliseconds / TimeCode.BaseUnit * frameRate));
                EndFrame = (int)Math.Round((EndTime.TotalMilliseconds / TimeCode.BaseUnit * frameRate));
            }

            public void CalculateTimeCodesFromFrameNumbers(double frameRate)
            {
                StartTime.TotalMilliseconds = StartFrame * (TimeCode.BaseUnit / frameRate);
                EndTime.TotalMilliseconds = EndFrame * (TimeCode.BaseUnit / frameRate);
            }

            public override string ToString()
            {
                return StartTime + " --> " + EndTime + " " + Text;
            }

            public int NumberOfLines
            {
                get
                {
                    return Utilities.GetNumberOfLines(Text);
                }
            }

            public double WordsPerMinute
            {
                get
                {
                    if (string.IsNullOrEmpty(Text))
                        return 0;
                    return (60.0 / Duration.TotalSeconds) * Text.CountWords();
                }
            }
        }
    }

↑ V3088 The expression was enclosed by parentheses twice: ((expression)). One pair of parentheses is unnecessary or misprint is present.

↑ V3088 The expression was enclosed by parentheses twice: ((expression)). One pair of parentheses is unnecessary or misprint is present.