from flask import Flask
from routes import currency_rates, api_currency_rates, time_zones

app = Flask(__name__)

# Регистрация маршрутов
app.add_url_rule('/currency-rates', 'currency_rates', currency_rates)
app.add_url_rule('/api/currency-rates', 'api_currency_rates', api_currency_rates)
app.add_url_rule('/time-zones', 'time_zones', time_zones)

if __name__ == '__main__':
    app.run(debug=True, host='192.168.0.103', port=7860)


#models.py
import requests
import time
import pytz
from datetime import datetime


class CurrencyRateFetcher:
    API_URL = "https://api.exchangerate-api.com/v4/latest/RUB"

    def fetch_rates(self):
        response = requests.get(self.API_URL)
        data = response.json()

        rates = data['rates']
        usd_rate = round(1 / rates['USD'], 2)
        eur_rate = round(1 / rates['EUR'], 2)
        cny_rate = round(1 / rates['CNY'], 2)

        return {
            'usd_rate': usd_rate,
            'eur_rate': eur_rate,
            'cny_rate': cny_rate,
            'updated_at': time.strftime('%H:%M')
        }


class TimeZoneFetcher:
    @staticmethod
    def get_current_time(timezone):
        tz = pytz.timezone(timezone)
        return datetime.now(tz).strftime('%H:%M')

#routes.py
from flask import jsonify
from models import CurrencyRateFetcher, TimeZoneFetcher
from templates import CurrencyRatePage, TimeZonePage


def currency_rates():
    fetcher = CurrencyRateFetcher()
    page = CurrencyRatePage(fetcher)
    return page.render()


def api_currency_rates():
    fetcher = CurrencyRateFetcher()
    rates = fetcher.fetch_rates()
    return jsonify(rates)


def time_zones():
    fetcher = TimeZoneFetcher()
    page = TimeZonePage(fetcher)
    return page.render()


#templates.py
from flask import render_template_string


class CurrencyRatePage:
    def __init__(self, fetcher):
        self.fetcher = fetcher

    def render(self):
        rates = self.fetcher.fetch_rates()
        return render_template_string('''
        <!DOCTYPE html>
        <html lang="ru">
        <head>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <title>Курс валют</title>
            <style>
                body {
                    font-family: Arial, sans-serif;
                    background-color: #f4f4f4;
                    margin: 0;
                    padding: 0;
                }
                .container {
                    background-color: #fff;
                    border-radius: 10px;
                    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
                    padding: 40px;
                    text-align: center;
                    width: 100%;
                    max-width: 600px;
                    margin: 0 auto;
                    margin-top: 50px;
                }
                .container h1 {
                    font-size: 24px;
                    margin: 0 0 20px;
                    color: #333;
                }
                .container p {
                    font-size: 18px;
                    margin: 10px 0;
                    color: #555;
                }
                .container p span {
                    font-weight: bold;
                    color: #007BFF;
                }
                .updated-at {
                    font-size: 14px;
                    color: #777;
                    margin-top: 20px;
                }
            </style>
        </head>
        <body>
            <div class="container">
                <h1>Курс валют (RUB)</h1>
                <p id="usd-rate">1 USD - <span>{{ usd_rate }} RUB</span></p>
                <p id="eur-rate">1 EUR - <span>{{ eur_rate }} RUB</span></p>
                <p id="cny-rate">1 CNY - <span>{{ cny_rate }} RUB</span></p>
                <div class="updated-at" id="updated-at">Обновлено в {{ updated_at }}</div>
            </div>
            <script>
                function updateRates() {
                    fetch('/api/currency-rates')
                        .then(response => response.json())
                        .then(data => {
                            document.getElementById('usd-rate').innerHTML = `1 USD - <span>${data.usd_rate} RUB</span>`;
                            document.getElementById('eur-rate').innerHTML = `1 EUR - <span>${data.eur_rate} RUB</span>`;
                            document.getElementById('cny-rate').innerHTML = `1 CNY - <span>${data.cny_rate} RUB</span>`;
                            document.getElementById('updated-at').innerHTML = `Обновлено в ${data.updated_at}`;
                        });
                }
                setInterval(updateRates, 300000); // Обновление каждые 5 минут (300000 миллисекунд)
                updateRates(); // Первоначальное обновление
            </script>
        </body>
        </html>
        ''', usd_rate=rates['usd_rate'], eur_rate=rates['eur_rate'], cny_rate=rates['cny_rate'],
                                      updated_at=rates['updated_at'])


class TimeZonePage:
    def __init__(self, fetcher):
        self.fetcher = fetcher

    @staticmethod
    def render():
        return render_template_string('''
        <!DOCTYPE html>
        <html lang="ru">
        <head>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <title>Время в разных часовых поясах</title>
            <style>
                body {
                    font-family: Arial, sans-serif;
                    background-color: #f4f4f4;
                    margin: 0;
                    padding: 0;
                }
                .container {
                    background-color: #fff;
                    border-radius: 10px;
                    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
                    padding: 40px;
                    text-align: center;
                    width: 100%;
                    max-width: 600px;
                    margin: 0 auto;
                    margin-top: 50px;
                }
                .container h1 {
                    font-size: 24px;
                    margin: 0 0 20px;
                    color: #333;
                }
                .container p {
                    font-size: 18px;
                    margin: 10px 0;
                    color: #555;
                }
                .container p span {
                    font-weight: bold;
                    color: #007BFF;
                }
            </style>
        </head>
        <body>
            <div class="container">
                <h1>Текущее время в разных часовых поясах</h1>
                <p>Ярославль: <span id="yaroslavl-time"></span></p>
                <p>Красноярск: <span id="krasnoyarsk-time"></span></p>
                <p>Иркутск: <span id="irkutsk-time"></span></p>
            </div>
            <script>
                function updateTimes() {
                    const now = new Date();

                    // Получаем количество минут смещения от UTC текущей системы
                    const localOffset = now.getTimezoneOffset();

                    const yaroslavlOffset = 3 * 60; // UTC+3 для Ярославля
                    const krasnoyarskOffset = 7 * 60; // UTC+7 для Красноярска
                    const irkutskOffset = 8 * 60; // UTC+8 для Иркутска

                    function getTimeWithOffset(targetOffset) {
                        // Корректируем отклонение системы
                        const utc = new Date(now.getTime() + localOffset * 60 * 1000);
                        const targetTime = new Date(utc.getTime() + targetOffset * 60 * 1000);
                        return targetTime.toLocaleTimeString('ru-RU', { hour: '2-digit', minute: '2-digit' });
                    }

                    document.getElementById('yaroslavl-time').innerHTML = getTimeWithOffset(yaroslavlOffset);
                    document.getElementById('krasnoyarsk-time').innerHTML = getTimeWithOffset(krasnoyarskOffset);
                    document.getElementById('irkutsk-time').innerHTML = getTimeWithOffset(irkutskOffset);
                }
                setInterval(updateTimes, 60000); // Обновление каждую минуту (60000 миллисекунд)
                updateTimes(); // Первоначальное обновление
            </script>
        </body>
        </html>
        ''')

что это за код и какая у него утруктура?