﻿using System;
using System.Collections.Generic;
using Foundation.ObjectHydrator.Interfaces;

namespace Foundation.ObjectHydrator.Generators
{
    public class UnitedKingdomCityGenerator : IGenerator<string>
    {
        private readonly Random _random;
        private IList<string> _citynames = new List<string>();

        public UnitedKingdomCityGenerator()
        {
            _random = RandomSingleton.Instance.Random;
            LoadCityNames();
        }

        private void LoadCityNames()
        {
            _citynames = new List<string>()
            {
                "Aberaeron",
                "Aberdare",
                "Aberdeen",
                "Aberfeldy",
                "Abergavenny",
                "Abergele",
                "Abertillery",
                "Aberystwyth",
                "Abingdon",
                "Accrington",
                "Adlington",
                "Airdrie",
                "Alcester",
                "Aldeburgh",
                "Aldershot",
                "Aldridge",
                "Alford",
                "Alfreton",
                "Alloa",
                "Alnwick",
                "Alsager",
                "Alston",
                "Amesbury",
                "Amlwch",
                "Ammanford",
                "Ampthill",
                "Andover",
                "Annan",
                "Antrim",
                "Appleby in Westmorland",
                "Arbroath",
                "Armagh",
                "Arundel",
                "Ashbourne",
                "Ashburton",
                "Ashby de la Zouch",
                "Ashford",
                "Ashington",
                "Ashton in Makerfield",
                "Atherstone",
                "Auchtermuchty",
                "Axminster",
                "Aylesbury",
                "Aylsham",
                "Ayr",
                "Bacup",
                "Bakewell",
                "Bala",
                "Ballater",
                "Ballycastle",
                "Ballyclare",
                "Ballymena",
                "Ballymoney",
                "Ballynahinch",
                "Banbridge",
                "Banbury",
                "Banchory",
                "Banff",
                "Bangor",
                "Barmouth",
                "Barnard Castle",
                "Barnet",
                "Barnoldswick",
                "Barnsley",
                "Barnstaple",
                "Barrhead",
                "Barrow in Furness",
                "Barry",
                "Barton upon Humber",
                "Basildon",
                "Basingstoke",
                "Bath",
                "Bathgate",
                "Batley",
                "Battle",
                "Bawtry",
                "Beaconsfield",
                "Bearsden",
                "Beaumaris",
                "Bebington",
                "Beccles",
                "Bedale",
                "Bedford",
                "Bedlington",
                "Bedworth",
                "Beeston",
                "Bellshill",
                "Belper",
                "Berkhamsted",
                "Berwick upon Tweed",
                "Betws y Coed",
                "Beverley",
                "Bewdley",
                "Bexhill on Sea",
                "Bicester",
                "Biddulph",
                "Bideford",
                "Biggar",
                "Biggleswade",
                "Billericay",
                "Bilston",
                "Bingham",
                "Birkenhead",
                "Birmingham",
                "Bishop Auckland",
                "Blackburn",
                "Blackheath",
                "Blackpool",
                "Blaenau Ffestiniog",
                "Blandford Forum",
                "Bletchley",
                "Bloxwich",
                "Blyth",
                "Bodmin",
                "Bognor Regis",
                "Bollington",
                "Bolsover",
                "Bolton",
                "Bootle",
                "Borehamwood",
                "Boston",
                "Bourne",
                "Bournemouth",
                "Brackley",
                "Bracknell",
                "Bradford",
                "Bradford on Avon",
                "Brading",
                "Bradley Stoke",
                "Bradninch",
                "Braintree",
                "Brechin",
                "Brecon",
                "Brentwood",
                "Bridge of Allan",
                "Bridgend",
                "Bridgnorth",
                "Bridgwater",
                "Bridlington",
                "Bridport",
                "Brigg",
                "Brighouse",
                "Brightlingsea",
                "Brighton",
                "Bristol",
                "Brixham",
                "Broadstairs",
                "Bromsgrove",
                "Bromyard",
                "Brynmawr",
                "Buckfastleigh",
                "Buckie",
                "Buckingham",
                "Buckley",
                "Bude",
                "Budleigh Salterton",
                "Builth Wells",
                "Bungay",
                "Buntingford",
                "Burford",
                "Burgess Hill",
                "Burnham on Crouch",
                "Burnham on Sea",
                "Burnley",
                "Burntisland",
                "Burntwood",
                "Burry Port",
                "Burton Latimer",
                "Bury",
                "Bushmills",
                "Buxton",
                "Caernarfon",
                "Caerphilly",
                "Caistor",
                "Caldicot",
                "Callander",
                "Calne",
                "Camberley",
                "Camborne",
                "Cambridge",
                "Camelford",
                "Campbeltown",
                "Cannock",
                "Canterbury",
                "Cardiff",
                "Cardigan",
                "Carlisle",
                "Carluke",
                "Carmarthen",
                "Carnforth",
                "Carnoustie",
                "Carrickfergus",
                "Carterton",
                "Castle Douglas",
                "Castlederg",
                "Castleford",
                "Castlewellan",
                "Chard",
                "Charlbury",
                "Chatham",
                "Chatteris",
                "Chelmsford",
                "Cheltenham",
                "Chepstow",
                "Chesham",
                "Cheshunt",
                "Chester",
                "Chester le Street",
                "Chesterfield",
                "Chichester",
                "Chippenham",
                "Chipping Campden",
                "Chipping Norton",
                "Chipping Sodbury",
                "Chorley",
                "Christchurch",
                "Church Stretton",
                "Cinderford",
                "Cirencester",
                "Clacton on Sea",
                "Cleckheaton",
                "Cleethorpes",
                "Clevedon",
                "Clitheroe",
                "Clogher",
                "Clydebank",
                "Coalisland",
                "Coalville",
                "Coatbridge",
                "Cockermouth",
                "Coggeshall",
                "Colchester",
                "Coldstream",
                "Coleraine",
                "Coleshill",
                "Colne",
                "Colwyn Bay",
                "Comber",
                "Congleton",
                "Conwy",
                "Cookstown",
                "Corbridge",
                "Corby",
                "Coventry",
                "Cowbridge",
                "Cowdenbeath",
                "Cowes",
                "Craigavon",
                "Cramlington",
                "Crawley",
                "Crayford",
                "Crediton",
                "Crewe",
                "Crewkerne",
                "Criccieth",
                "Crickhowell",
                "Crieff",
                "Cromarty",
                "Cromer",
                "Crowborough",
                "Crowthorne",
                "Crumlin",
                "Cuckfield",
                "Cullen",
                "Cullompton",
                "Cumbernauld",
                "Cupar",
                "Cwmbran",
                "Dalbeattie",
                "Dalkeith",
                "Darlington",
                "Dartford",
                "Dartmouth",
                "Darwen",
                "Daventry",
                "Dawlish",
                "Deal",
                "Denbigh",
                "Denton",
                "Derby",
                "Dereham",
                "Devizes",
                "Dewsbury",
                "Didcot",
                "Dingwall",
                "Dinnington",
                "Diss",
                "Dolgellau",
                "Donaghadee",
                "Doncaster",
                "Dorchester",
                "Dorking",
                "Dornoch",
                "Dover",
                "Downham Market",
                "Downpatrick",
                "Driffield",
                "Dronfield",
                "Droylsden",
                "Dudley",
                "Dufftown",
                "Dukinfield",
                "Dumbarton",
                "Dumfries",
                "Dunbar",
                "Dunblane",
                "Dundee",
                "Dunfermline",
                "Dungannon",
                "Dunoon",
                "Duns",
                "Dunstable",
                "Durham",
                "Dursley",
                "Easingwold",
                "East Grinstead",
                "East Kilbride",
                "Eastbourne",
                "Eastleigh",
                "Eastwood",
                "Ebbw Vale",
                "Edenbridge",
                "Edinburgh",
                "Egham",
                "Elgin",
                "Ellesmere",
                "Ellesmere Port",
                "Ely",
                "Enniskillen",
                "Epping",
                "Epsom",
                "Erith",
                "Esher",
                "Evesham",
                "Exeter",
                "Exmouth",
                "Eye",
                "Eyemouth",
                "Failsworth",
                "Fairford",
                "Fakenham",
                "Falkirk",
                "Falkland",
                "Falmouth",
                "Fareham",
                "Faringdon",
                "Farnborough",
                "Farnham",
                "Farnworth",
                "Faversham",
                "Felixstowe",
                "Ferndown",
                "Filey",
                "Fintona",
                "Fishguard",
                "Fivemiletown",
                "Fleet",
                "Fleetwood",
                "Flint",
                "Flitwick",
                "Folkestone",
                "Fordingbridge",
                "Forfar",
                "Forres",
                "Fort William",
                "Fowey",
                "Framlingham",
                "Fraserburgh",
                "Frodsham",
                "Frome",
                "Gainsborough",
                "Galashiels",
                "Gateshead",
                "Gillingham",
                "Glasgow",
                "Glastonbury",
                "Glossop",
                "Gloucester",
                "Godalming",
                "Godmanchester",
                "Goole",
                "Gorseinon",
                "Gosport",
                "Gourock",
                "Grange over Sands",
                "Grangemouth",
                "Grantham",
                "Grantown on Spey",
                "Gravesend",
                "Grays",
                "Great Yarmouth",
                "Greenock",
                "Grimsby",
                "Guildford",
                "Haddington",
                "Hadleigh",
                "Hailsham",
                "Halesowen",
                "Halesworth",
                "Halifax",
                "Halstead",
                "Haltwhistle",
                "Hamilton",
                "Harlow",
                "Harpenden",
                "Harrogate",
                "Hartlepool",
                "Harwich",
                "Haslemere",
                "Hastings",
                "Hatfield",
                "Havant",
                "Haverfordwest",
                "Haverhill",
                "Hawarden",
                "Hawick",
                "Hay on Wye",
                "Hayle",
                "Haywards Heath",
                "Heanor",
                "Heathfield",
                "Hebden Bridge",
                "Helensburgh",
                "Helston",
                "Hemel Hempstead",
                "Henley on Thames",
                "Hereford",
                "Herne Bay",
                "Hertford",
                "Hessle",
                "Heswall",
                "Hexham",
                "High Wycombe",
                "Higham Ferrers",
                "Highworth",
                "Hinckley",
                "Hitchin",
                "Hoddesdon",
                "Holmfirth",
                "Holsworthy",
                "Holyhead",
                "Holywell",
                "Honiton",
                "Horley",
                "Horncastle",
                "Hornsea",
                "Horsham",
                "Horwich",
                "Houghton le Spring",
                "Hove",
                "Howden",
                "Hoylake",
                "Hucknall",
                "Huddersfield",
                "Hungerford",
                "Hunstanton",
                "Huntingdon",
                "Huntly",
                "Hyde",
                "Hythe",
                "Ilford",
                "Ilfracombe",
                "Ilkeston",
                "Ilkley",
                "Ilminster",
                "Innerleithen",
                "Inveraray",
                "Inverkeithing",
                "Inverness",
                "Inverurie",
                "Ipswich",
                "Irthlingborough",
                "Irvine",
                "Ivybridge",
                "Jarrow",
                "Jedburgh",
                "Johnstone",
                "Keighley",
                "Keith",
                "Kelso",
                "Kempston",
                "Kendal",
                "Kenilworth",
                "Kesgrave",
                "Keswick",
                "Kettering",
                "Keynsham",
                "Kidderminster",
                "Kilbarchan",
                "Kilkeel",
                "Killyleagh",
                "Kilmarnock",
                "Kilwinning",
                "Kinghorn",
                "Kingsbridge",
                "Kington",
                "Kingussie",
                "Kinross",
                "Kintore",
                "Kirkby",
                "Kirkby Lonsdale",
                "Kirkcaldy",
                "Kirkcudbright",
                "Kirkham",
                "Kirkwall",
                "Kirriemuir",
                "Knaresborough",
                "Knighton",
                "Knutsford",
                "Ladybank",
                "Lampeter",
                "Lanark",
                "Lancaster",
                "Langholm",
                "Largs",
                "Larne",
                "Laugharne",
                "Launceston",
                "Laurencekirk",
                "Leamington Spa",
                "Leatherhead",
                "Ledbury",
                "Leeds",
                "Leek",
                "Leicester",
                "Leighton Buzzard",
                "Leiston",
                "Leominster",
                "Lerwick",
                "Letchworth",
                "Leven",
                "Lewes",
                "Leyland",
                "Lichfield",
                "Limavady",
                "Lincoln",
                "Linlithgow",
                "Lisburn",
                "Liskeard",
                "Lisnaskea",
                "Littlehampton",
                "Liverpool",
                "Llandeilo",
                "Llandovery",
                "Llandrindod Wells",
                "Llandudno",
                "Llanelli",
                "Llanfyllin",
                "Llangollen",
                "Llanidloes",
                "Llanrwst",
                "Llantrisant",
                "Llantwit Major",
                "Llanwrtyd Wells",
                "Loanhead",
                "Lochgilphead",
                "Lockerbie",
                "Londonderry",
                "Long Eaton",
                "Longridge",
                "Looe",
                "Lossiemouth",
                "Lostwithiel",
                "Loughborough",
                "Loughton",
                "Louth",
                "Lowestoft",
                "Ludlow",
                "Lurgan",
                "Luton",
                "Lutterworth",
                "Lydd",
                "Lydney",
                "Lyme Regis",
                "Lymington",
                "Lynton",
                "Mablethorpe",
                "Macclesfield",
                "Machynlleth",
                "Maesteg",
                "Magherafelt",
                "Maidenhead",
                "Maidstone",
                "Maldon",
                "Malmesbury",
                "Malton",
                "Malvern",
                "Manchester",
                "Manningtree",
                "Mansfield",
                "March",
                "Margate",
                "Market Deeping",
                "Market Drayton",
                "Market Harborough",
                "Market Rasen",
                "Market Weighton",
                "Markethill",
                "Markinch",
                "Marlborough",
                "Marlow",
                "Maryport",
                "Matlock",
                "Maybole",
                "Melksham",
                "Melrose",
                "Melton Mowbray",
                "Merthyr Tydfil",
                "Mexborough",
                "Middleham",
                "Middlesbrough",
                "Middlewich",
                "Midhurst",
                "Midsomer Norton",
                "Milford Haven",
                "Milngavie",
                "Milton Keynes",
                "Minehead",
                "Moffat",
                "Mold",
                "Monifieth",
                "Monmouth",
                "Montgomery",
                "Montrose",
                "Morecambe",
                "Moreton in Marsh",
                "Moretonhampstead",
                "Morley",
                "Morpeth",
                "Motherwell",
                "Musselburgh",
                "Nailsea",
                "Nailsworth",
                "Nairn",
                "Nantwich",
                "Narberth",
                "Neath",
                "Needham Market",
                "Neston",
                "New Mills",
                "New Milton",
                "Newbury",
                "Newcastle",
                "Newcastle Emlyn",
                "Newcastle upon Tyne",
                "Newent",
                "Newhaven",
                "Newmarket",
                "Newport",
                "Newport Pagnell",
                "Newport on Tay",
                "Newquay",
                "Newry",
                "Newton Abbot",
                "Newton Aycliffe",
                "Newton Stewart",
                "Newton le Willows",
                "Newtown",
                "Newtownabbey",
                "Newtownards",
                "Normanton",
                "North Berwick",
                "North Walsham",
                "Northallerton",
                "Northampton",
                "Northwich",
                "Norwich",
                "Nottingham",
                "Nuneaton",
                "Oakham",
                "Oban",
                "Okehampton",
                "Oldbury",
                "Oldham",
                "Oldmeldrum",
                "Olney",
                "Omagh",
                "Ormskirk",
                "Orpington",
                "Ossett",
                "Oswestry",
                "Otley",
                "Oundle",
                "Oxford",
                "Padstow",
                "Paignton",
                "Painswick",
                "Paisley",
                "Peebles",
                "Pembroke",
                "Penarth",
                "Penicuik",
                "Penistone",
                "Penmaenmawr",
                "Penrith",
                "Penryn",
                "Penzance",
                "Pershore",
                "Perth",
                "Peterborough",
                "Peterhead",
                "Peterlee",
                "Petersfield",
                "Petworth",
                "Pickering",
                "Pitlochry",
                "Pittenweem",
                "Plymouth",
                "Pocklington",
                "Polegate",
                "Pontefract",
                "Pontypridd",
                "Poole",
                "Port Talbot",
                "Portadown",
                "Portaferry",
                "Porth",
                "Porthcawl",
                "Porthmadog",
                "Portishead",
                "Portrush",
                "Portsmouth",
                "Portstewart",
                "Potters Bar",
                "Potton",
                "Poulton le Fylde",
                "Prescot",
                "Prestatyn",
                "Presteigne",
                "Preston",
                "Prestwick",
                "Princes Risborough",
                "Prudhoe",
                "Pudsey",
                "Pwllheli",
                "Ramsgate",
                "Randalstown",
                "Rayleigh",
                "Reading",
                "Redcar",
                "Redditch",
                "Redhill",
                "Redruth",
                "Reigate",
                "Retford",
                "Rhayader",
                "Rhuddlan",
                "Rhyl",
                "Richmond",
                "Rickmansworth",
                "Ringwood",
                "Ripley",
                "Ripon",
                "Rochdale",
                "Rochester",
                "Rochford",
                "Romford",
                "Romsey",
                "Ross on Wye",
                "Rostrevor",
                "Rothbury",
                "Rotherham",
                "Rothesay",
                "Rowley Regis",
                "Royston",
                "Rugby",
                "Rugeley",
                "Runcorn",
                "Rushden",
                "Rutherglen",
                "Ruthin",
                "Ryde",
                "Rye",
                "Saffron Walden",
                "Saintfield",
                "Salcombe",
                "Sale",
                "Salford",
                "Salisbury",
                "Saltash",
                "Saltcoats",
                "Sandbach",
                "Sandhurst",
                "Sandown",
                "Sandwich",
                "Sandy",
                "Sawbridgeworth",
                "Saxmundham",
                "Scarborough",
                "Scunthorpe",
                "Seaford",
                "Seaton",
                "Sedgefield",
                "Selby",
                "Selkirk",
                "Selsey",
                "Settle",
                "Sevenoaks",
                "Shaftesbury",
                "Shanklin",
                "Sheerness",
                "Sheffield",
                "Shepshed",
                "Shepton Mallet",
                "Sherborne",
                "Sheringham",
                "Shildon",
                "Shipston on Stour",
                "Shoreham by Sea",
                "Shrewsbury",
                "Sidmouth",
                "Sittingbourne",
                "Skegness",
                "Skelmersdale",
                "Skipton",
                "Sleaford",
                "Slough",
                "Smethwick",
                "Soham",
                "Solihull",
                "Somerton",
                "South Molton",
                "South Shields",
                "South Woodham Ferrers",
                "Southam",
                "Southampton",
                "Southborough",
                "Southend on Sea",
                "Southport",
                "Southsea",
                "Southwell",
                "Southwold",
                "Spalding",
                "Spennymoor",
                "Spilsby",
                "Stafford",
                "Staines",
                "Stamford",
                "Stanley",
                "Staveley",
                "Stevenage",
                "Stirling",
                "Stockport",
                "Stockton on Tees",
                "Stoke on Trent",
                "Stone",
                "Stowmarket",
                "Strabane",
                "Stranraer",
                "Stratford upon Avon",
                "Strood",
                "Stroud",
                "Sudbury",
                "Sunderland",
                "Sutton Coldfield",
                "Sutton in Ashfield",
                "Swadlincote",
                "Swanage",
                "Swanley",
                "Swansea",
                "Swindon",
                "Tadcaster",
                "Tadley",
                "Tain",
                "Talgarth",
                "Tamworth",
                "Taunton",
                "Tavistock",
                "Teignmouth",
                "Telford",
                "Tenby",
                "Tenterden",
                "Tetbury",
                "Tewkesbury",
                "Thame",
                "Thatcham",
                "Thaxted",
                "Thetford",
                "Thirsk",
                "Thornbury",
                "Thrapston",
                "Thurso",
                "Tilbury",
                "Tillicoultry",
                "Tipton",
                "Tiverton",
                "Tobermory",
                "Todmorden",
                "Tonbridge",
                "Torpoint",
                "Torquay",
                "Totnes",
                "Totton",
                "Towcester",
                "Tredegar",
                "Tregaron",
                "Tring",
                "Troon",
                "Trowbridge",
                "Truro",
                "Tunbridge Wells",
                "Tywyn",
                "Uckfield",
                "Ulverston",
                "Uppingham",
                "Usk",
                "Uttoxeter",
                "Ventnor",
                "Verwood",
                "Wadebridge",
                "Wadhurst",
                "Wakefield",
                "Wallasey",
                "Wallingford",
                "Walsall",
                "Waltham Abbey",
                "Waltham Cross",
                "Walton on Thames",
                "Walton on the Naze",
                "Wantage",
                "Ware",
                "Wareham",
                "Warminster",
                "Warrenpoint",
                "Warrington",
                "Warwick",
                "Washington",
                "Watford",
                "Wednesbury",
                "Wednesfield",
                "Wellingborough",
                "Wellington",
                "Wells",
                "Wells next the Sea",
                "Welshpool",
                "Welwyn Garden City",
                "Wem",
                "Wendover",
                "West Bromwich",
                "Westbury",
                "Westerham",
                "Westhoughton",
                "Weston super Mare",
                "Wetherby",
                "Weybridge",
                "Weymouth",
                "Whaley Bridge",
                "Whitby",
                "Whitchurch",
                "Whitehaven",
                "Whitley Bay",
                "Whitnash",
                "Whitstable",
                "Whitworth",
                "Wick",
                "Wickford",
                "Widnes",
                "Wigan",
                "Wigston",
                "Wigtown",
                "Willenhall",
                "Wincanton",
                "Winchester",
                "Windermere",
                "Winsford",
                "Winslow",
                "Wisbech",
                "Witham",
                "Withernsea",
                "Witney",
                "Woburn",
                "Woking",
                "Wokingham",
                "Wolverhampton",
                "Wombwell",
                "Woodbridge",
                "Woodstock",
                "Wootton Bassett",
                "Worcester",
                "Workington",
                "Worksop",
                "Worthing",
                "Wotton under Edge",
                "Wrexham",
                "Wymondham",
                "Yarm",
                "Yarmouth",
                "Yate",
                "Yateley",
                "Yeadon",
                "Yeovil",
                "York"
            };
        }

        public string Generate()
        {
            return _citynames[_random.Next(0, _citynames.Count)];
        }
    }
}